蓝桥_Java实用总结

阅读原文

序引

准备17号的蓝桥杯写的这个文档,目前打算记录三个方面

  1. Java实用方法
  2. 做题的总结
  3. 各种模板

eclipse的使用

  1. 代码模板:main+Alt+/;syso+Alt+/;
  2. 快捷键:Ctrl+1快速修复;Ctrl+Shift+O快速导包;Ctrl+Shift+F 格式化当前代码;Shift+Enter 在当前行的下一行插入空行

Jav实用方法

输入

  1. 对字符串的获取可以采用next()和nextline(),用hasNext()或hasNextline()判断是否还有数据输入
    hasNext()或hasNextline()在while循环中可能没啥区别,但next()和nextline()却大有不同
    next()不能读取空格,换言之,读取到有效字符之后遇到空格就会停止,但nextline()以Enter结束,能存储对应格式的任何字符
    在比赛的使用中可以将按行输入的元素统一存储到string字符串中,然后用string自带的split按空格或其他(,)进行分割存储到字符串数组中
     Scanner sc=new Scanner(System.in);
     String s=sc.nextLine();
     String arr[]=s.split(" ");
     for (String t:arr)
         System.out.println(t);
    
  2. 字符的输入:Java中不提供nextChar()的方法,但可以使用next().charAt(0)
     Scanner sc = new Scanner(System.in);
     char c= sc.next().charAt(0);
    

输出

  1. %4d和%-4d的区别:%4d是靠右输出四位,不足用空格补齐;%-4d是靠左输出
  2. 输出N位小数,可以使用DecimalFormat对格式进行定义;或者使用String.format(格式,浮点变量)直接打印
     public static void main(String[] args) {
         float f= (float) 3.234567;
         //正常输出
         System.out.println(f);
         //采用类
         DecimalFormat df=new DecimalFormat("#0.00");
         System.out.println(df.format(f));
         //模仿C语言
         System.out.printf("%.2f\n",f);//这里使用的C语言中的 printf
         //转换格式
         System.out.println(String.format("%.2f",f));
    

    结果:2.35 2.35

数组的操作

数组的拷贝:

  1. 数组的拷贝,可以使用数组自带的clone()方法
     public static void main(String[] args) {
         int a[]={1,2,3,4};
         int b[]=a.clone();
         for (int n:b)
             System.out.print(n+" ");
     }
    

    结果:1 2 3 4

  2. System.arraycopy(Object a, int begin_a, Object b, int begin_b, int length);方法
     public static void main(String[] args) {
         int a[]={1,2,3,4};
         int b[]=new int[10];
         System.arraycopy(a,0,b,0,3);
         for (int n:b)
             System.out.print(n+" ");
     }//这种方法可以进行自定义长度的拷贝
    

    结果:1 2 3 0 0 0 0 0 0 0

  3. Arrays.copyOf(object,length);方法
     public static void main(String[] args) {
         int a[]={1,2,3,4};
         int b[]= Arrays.copyOf(a,3);
         for (int n:b)
             System.out.print(n+" ");
     }
    

    结果:1 2 3

String类型的使用

  1. 存入两个字符相同的string型时,两者的地址也相同(将后创建的地址指向前者,节约内存);但是new String的两个不同对象的内容即便相同地址也不同
    public static void main(String[] args) {
        String a="asd";
        String b="asd";
        boolean t=a==b;
        String c=new String("iop");
        String d=new String("iop");
        boolean y=c==d;
        System.out.println(t);
        System.out.println(y);
    }//==和!=是用来判断string对象地址是否相同的
    

    结果:true
    false

  2. 判断string对象是否相同用自带的equals方法
     public static void main(String[] args) {
         String a="asd";
         String b="asd";
         if (a.equals(b))
             System.out.println("==");
         else
             System.out.println("!=");
     }
    

    结果:==

  3. 要想遍历string的字符内容,需要将其转换为字符数组
     public static void main(String[] args) {
         String a = "asd";
         char arr[] = a.toCharArray();
         for (char n : arr)
             System.out.print(n + " ");
     }
    

    结果:a s d

  4. string自带的使用方法还有split:分割;大小写转换,提取子字符串等,具体可查阅API

格式之间的转换

  1. 最简单直接的是在变量前加(目标类型)
    char c= 'a';
    int a=(int)c;
    System.out.println(a);
    
    此方法只用于基本的数据类型,String类型的不行
  2. String和其他基本数据类型的转换
    • 可以使用toString将其他数据类型转换为String类,但这种方法只对包装类起作用(如:Integer)
    • 使用String自带的valueOf()方法,支持将基本的数据类型转换
    • 而将String转换为其他,可以用自带类的.parseXXX(string)方法
    Integer a=new Integer(100);
    String s1=a.toString();//类自带的toString()方法
    int i=99;
    String s2=String.valueOf(i);//String自带的valueOf()方法
    Integer b=Integer.parseInt(s2);//每个类都有.parseXXX(String s)方法
    

快速排序

实用Arrays中的sort方法可以对数组进行快速排序

    int[] arr = {1, 3, 6, 2, 4, 8, 7, 9};
    Arrays.sort(arr);
    for (int m : arr)
        System.out.print(m + " ");

若要实现降序排序可以使用Collections.reverseOrder()方法(数组必须为Integer类)

    Integer[] arr = {1, 3, 6, 2, 4, 8, 7, 9};
    Arrays.sort(arr, Collections.reverseOrder());
    for (int m : arr)
        System.out.print(m + " ");

大数的使用

  1. 定义BigInteger类型可以使用实例化类的方法,也可以使用BigInteger中的valueOf(数字/变量)
    BigInteger a = new BigInteger("3");
    BigInteger b = BigInteger.valueOf(3);
    int i = 788;
    BigInteger c = BigInteger.valueOf(i);
  1. 大数的类是在java.math.*包里的,所以继承了math的所有方法,而运算也是使用方法来进行
    BigInteger a = new BigInteger("3");
    BigInteger b = BigInteger.valueOf(-3);
    int i = 788;
    BigInteger c = BigInteger.valueOf(i);
    BigInteger ad=a.add(c);
    BigInteger sub=a.subtract(b);
    BigInteger mul=a.multiply(b);
    BigInteger div=c.divide(a);
    BigInteger re=c.remainder(a);
    BigInteger ab=b.abs();
    System.out.println(ad);
    System.out.println(sub);
    System.out.println(mul);
    System.out.println(div);
    System.out.println(re);
    System.out.println(ab);

结果:791 6 -9 262 2 3

Math类

  1. 可以求sqrt(平方根)、abs(绝对值)、max、min、pow(幂)、取整(ceil、floor、round)具体查阅API
  2. 输出一个随机数用random()方法
    public static void main(String[] args) {
        double c = Math.random();
        System.out.println(c);//输出一个0-1之间的随机数(double类型)
        int b = 100;
        int d = (int) (Math.random() * b + 1);//输出一个1-b之间的随机数
        System.out.println(d);
        int a = 50;
        int e = (int) (Math.random() * (b - a + 1) + a);// 输出一个a-b的随机数
        System.out.println(e);
    }//+ 1 是因为random()最大取不到1,所以上限取整后就会少1
    

日期类

MONTH字段是从0月开始计数的,所以12月对应的值是11。DAY_OF_WEEK中星期天对应的是1,星期一对应的是2,星期六对应的是7,而YEAR和DAY_OF_MONTH都是从1开始计数

public static void main(String[] args) {
        Date date=new Date();
        System.out.println(date.toString());//输出当前时间
        SimpleDateFormat ft=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//定义日期格式
        System.out.println(ft.format(date));//按格式输出
        System.out.printf("%tR",date);printf方法也具有日期格式的输出
        Calendar c = Calendar.getInstance();//默认是当前日期
        c.set(2009, 6 - 1, 12);//对日期对象进行设置
        int month=c.get(Calendar.MONTH)+1;//月份的存储是从0开始的
        get(Calendar.*)方法可以获取很多日期信息
        GregorianCalendar gc=new GregorianCalendar(2020,10-1,14);
        int a=gc.getActualMaximum(Calendar.DAY_OF_MONTH);//当前月的的总日
        int b=gc.get(Calendar.DAY_OF_WEEK);//当前月第一天是星期几
        System.out.println(a);
        System.out.println(b);
    }

Date类

public static void main(String[] args) {
    Date date1 = new Date(21, 6, 23, 12, 0, 0);
    System.out.println(date1);
    Date date2 = new Date(120, 6, 1, 12, 0, 0);
    System.out.println(date2);
    long time = date2.getTime() - date1.getTime();
    System.out.println(time / (60000));//得到的值是毫秒,求分钟要/60000
}

模板

公因公倍数

  1. 求最大公约数可以采用辗转相除法,就是两数的最大公约数就是较小数和两数余数的最大公约数
  2. 最小公倍数等于两数的乘积除最大公约数
public class 练习 {
    static int gcd(int a,int b){
        return b==0?a:gcd(b,a%b);//辗转相除法,两数的最大公约数等于较小数与两数余数的最大公约数
    }
    static int lcm(int a,int b){
        return a*b/gcd(a,b);//最大公倍数等于两数相乘除最大公约数
    }
    public static void main(String[] args) {
        System.out.println(gcd(12,5));
        System.out.println(lcm(12,5));
    }
}

进制转换

在Integer对象中,常用的进制转换

十进制的转换对象对应的方法和参数返回值
转换成二进制Integer.toBinaryString(n);一个二进制字符串
转换成八进制Integer.toOctalString(n);一个八进制字符串
转换成十六进制Integer.toHexString(n);一个十六进制字符串
转换成r进制Integer.toString(100, 16);一个r进制字符串

完全可以用Integer.toString(n,radix)用来进制的转换

public static void main(String[] args) {
        int n=18;
        System.out.println(Integer.toBinaryString(n));//转换二进制
        System.out.println(Integer.toOctalString(n));//转换成八进制
        System.out.println(Integer.toHexString(n));//转换成十六进制
        System.out.println(Integer.toString(n,2));
        String s = "10101";
        System.out.println(Integer.parseInt(s,2));//回转为十进制
        // 判断十进制整数转换成二进制后“1”的个数
        System.out.println(Integer.bitCount(21));
    }

全排列

static int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
static int ans = 0;
static void dfs(int k) {
    if (k >= 9) {//递归出口
        ans++;
    }
    for (int i = k; i < 9; i++) {
        int t = arr[k];
        arr[k] = arr[i];
        arr[i] = t;//将相邻的两位数互换
        dfs(k + 1);//互换下一个
        t = arr[k];
        arr[k] = arr[i];
        arr[i] = t;//回溯时更换回来,不影响下一次排列
    }
}

public static void main(String[] args) {
    dfs(0);
    System.out.println(ans);
}

判断闰年

public static void main(String[] args) {
    int n=2000;
    if (n%400==0||(n%4==0&&n%100!=0))
        System.out.println("true");
    else
        System.out.println("false");
}

题目总结

TreeSet排序

如果数据使用String进行使用却又需要按照顺序进行输出时,可以将最后的结果添加进TreeSet中进行排序

Set<String> ans=new TreeSet<String>();
for (String s:ans) 
    System.out.println(s);
  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值