第二周java+基础算法复习总结

本文介绍了Java中的泛型类与泛型方法的使用,包括Set集合的特性和TreeSet与HashSet的区别,以及Map接口的简单应用。通过示例展示了如何处理时间加法问题和利用Math.pow解决算法问题。此外,还讨论了字符加密变换的实现方法。这些基础知识对于理解和应用Java集合框架及算法设计至关重要。
摘要由CSDN通过智能技术生成

泛型和集合的简单使用

public class Easy {
    public static void main(String[] args) {
        Cat<String>cat=new Cat();
        String m1=cat.<Integer>say(111);//泛型类中的泛型方法,
        String m2=cat.getName();
        //System.out.print(m1);
        System.out.print(m2);
    }
}
class Cat <T extends Comparable>
{
    private T name;
    private T age;
    private T birth;
    private T color;
            public <T extends Comparable> String say(T name)//泛型方法。 区别//泛型方法或类的定义课限制一些东西
    {
        return "1234";
    }
    public T getName()//泛型类,区别于泛型方法
    {
        return this.name;
    }


}

需要记住的蛮少,泛型一般以<>放在类定义的后面部分,泛型方法一般放在方法限制public,private等的后面,注意一点泛型方法和泛型类中的方法是不一样的,此外泛型类可以定义多个T,U,R等,另外在定义时,可以extends一些接口,这样只有实现了这个接口的类可以加入这些类里面。
在这里插入图片描述
基本的一些知识点,继承collection接口。基本的增删擦改的方法,记忆。
Arraylist和Linkedlist在插入和删除效率方法有所不同,注意Object[]toArray()方法的应用,返回集合的相应对象的数组,此外各种方法的应用也记忆清楚,另外最好集合+泛型配合使用,否则在遍历的时候出现类型不匹配,需要强制类型转换的问题。

Set集合的使用规则

public class HashSet {
    public static void main(String[]args) {
        /*
        Set<Integer> set=new TreeSet();
        for(int i=0;i<10;i++)
        {
            set.add(i);
        }
        set.add(50);//自动排序
        set.add(30);
        Iterator<Integer> it=set.iterator();
        for(int i=0;i<12;i++)//遍历方法,注意加泛型。
        {
            int m=it.next();
            System.out.print(m);


        }


         */

/* 不按顺序,不按套路。
        Set<Integer>sets=new java.util.HashSet<>();
        for(int i=0;i<10;i++)
        {
            sets.add(i);
        }
        sets.add(50);
        sets.add(30);
        Iterator<Integer> it=sets.iterator();
        while(it.hasNext())
        {
            int m=it.next();
            System.out.print(m);
        }



    */
    }

}

Set集合除了基本操作的问题,其自动覆盖相同的值的特性在算法题的应用上,可以获得很巧妙的效果另外,此代码对于理解TreeSet和HashSet的区别有很大帮助,Debug出装填因子 0.75.和哈希表的双倍扩容也很关键。

Map关键对的简单使用

public class Map {
    public static void main(String[] args) {
        java.util.Map<String,Employ> staff=new HashMap();
        Employ a=new Employ(21,"HXT");
        staff.put("2010300617",a);
        staff.put("2010300725",new Employ(20,"赵航"));
        staff.put("2010300717",new Employ(20,"王思儒"));
        System.out.print(staff.get("2010300617"));//Map的打印、
       // staff.forEach((k,v)->System.out.print(k+v));Lambda表达式,循环遍历
        Set keys=staff.keySet();
        Iterator<String> it=keys.iterator();
        while(it.hasNext())//第一种遍历方式
        {
            String s=it.next();
            System.out.print(staff.get(s));
        }

    }
}
class Employ
{
    private int age;
    String name;

    public Employ(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Employ{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

各种不同的遍历方法多理解几遍,另外其不是继承Collection接口。元素的添加方式为put,而且第一个key-是唯一的value不唯一性。

算法篇之时钟加时问题

题目背景:有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。

读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。

import java.util.Scanner;
public class Main {
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
 
			int startTime = 0,stopTime,elapsed = 0,minute;
			Scanner scanner = new Scanner(System.in);
			if(scanner.hasNext()) {//判断是否有输入
				startTime = scanner.nextInt();
				elapsed = scanner.nextInt();//流失时间
			}
			scanner.close();
			minute = (startTime/100)*60+startTime%100;
			stopTime = minute+elapsed;
			stopTime = (stopTime/60)*100+stopTime%60;
			if(startTime%100 == 0){
		    System.out.println("0"+stopTime);   
		    }else{   
			System.out.println(stopTime);
		   }
		}
}

注意思想的使用,先转换成能进行数学运算的数据,在转换成方便于输出的数据,称其为 双重转换法。

算法篇 Math的用法

题目背景:2018年FISM(世界魔术大会)近景总冠军简纶廷的表演中有一个情节:以桌面上一根带子为界,当他将纸牌从带子的一边推到另一边时,纸牌会变成硬币;把硬币推回另一边会变成纸牌。

这里我们假设纸牌会变成等量的硬币,而硬币变成纸牌时,纸牌的数量会加倍。那么给定纸牌的初始数量,当他来回推了 N 次(来/回各算一次)后,手里拿的是纸牌还是硬币?数量是多少?

输入格式:
输入在一行里给出两个正整数,分别是纸牌的初始数量和魔术师推送的次数。这里假设初始状态下魔术师手里全是纸牌。

输出格式:
如果最后魔术师手里是纸牌,输出 0 和纸牌数量;如果是硬币,则输出 1 和硬币数量。数字间须有 1 个空格。题目保证结果数值不超出整型范围(即 2
31
−1)。

import java.util.*;
public class Main
{
    public static void main(String[]args)
    {
        Scanner myscanner=new Scanner(System.in);
        int m1=myscanner.nextInt();
        int m2=myscanner.nextInt();
        int n=new Double(m1*(Math.pow(2,m2/2))).intValue();
        if(m2%2==1)
       System.out.print(1+" "+n);
        else
            System.out.print(0+" "+n);
    }
}

基本思想简单,但是注意使用pow函数时,运算结果默认为double类型,需要new Double().intValue 转换为Int类型输出。
其他小知识点:** String sa=String.format(“%.1f”,a);//java中保存几位几位精度一般的转换方式**

字符变换问题

本题要求编写程序,将英文字母替换加密。为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。变换规则是:将明文中的所有英文字母替换为字母表中的后一个字母,同时将小写字母转换为大写字母,大写字母转换为小写字母。例如,字母a->B、b->C、…、z->AA->b、B->c、…、Z->a。输入一行字符,将其中的英文字母按照以上规则转换后输出,其他字符按原样输出。

输入格式:
输入一行字符,以回车符 '\n'作为 结束符。

输出格式:
将输入的一行字符中的所有英文字母替换为字母表中的后一个字母,同时将小写字母转换为大写字母,大写字母转换为小写字母后输出,其他字符按原样输出。

输入样例:
在这里给出一组输入。例如:

Reold  Z123?
输出样例:
在这里给出相应的输出。例如:

sFPME  a123?
import java.util.*;
public class Main
{
    public static void main(String[]args)
    {
        Scanner myscanner=new Scanner(System.in);
        String s=myscanner.nextLine();
        char[]arr=s.toCharArray();
        for(int i=0;i<arr.length;i++)
        {
            int n=(int)arr[i];
            if(n>=65&&n<=89)
                n=n+32+1;
            else if(n==90)
                n=n-25+32;
            else if(n>=97&&n<=121)
                n=n+1-32;
            else if(n==122)
                n=n-25-32;
            System.out.print((char)n);
          }
    }
        
}

注意.nextLine();输入字符串的使用。此外处理字符串问题一般先转换为字符数组进行处理,要记住ASC码中 大小写字母的值。
小知识点: char a=myscanner.next().charAt(0);输入单个字符的方法。
就是这些,持续更新,我在精读中将常见的列举出来便于大家理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不说再见qwq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值