序引
准备17号的蓝桥杯写的这个文档,目前打算记录三个方面
- Java实用方法
- 做题的总结
- 各种模板
eclipse的使用
- 代码模板:main+Alt+/;syso+Alt+/;
- 快捷键:Ctrl+1快速修复;Ctrl+Shift+O快速导包;Ctrl+Shift+F 格式化当前代码;Shift+Enter 在当前行的下一行插入空行
Jav实用方法
输入
- 对字符串的获取可以采用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);
- 字符的输入:Java中不提供nextChar()的方法,但可以使用
next().charAt(0)
Scanner sc = new Scanner(System.in); char c= sc.next().charAt(0);
输出
- %4d和%-4d的区别:%4d是靠右输出四位,不足用空格补齐;%-4d是靠左输出
- 输出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
数组的操作
数组的拷贝:
- 数组的拷贝,可以使用数组自带的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
- 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
- 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类型的使用
- 存入两个字符相同的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 - 判断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("!="); }
结果:==
- 要想遍历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
- string自带的使用方法还有split:分割;大小写转换,提取子字符串等,具体可查阅API
格式之间的转换
- 最简单直接的是在变量前加(目标类型)
此方法只用于基本的数据类型,String类型的不行char c= 'a'; int a=(int)c; System.out.println(a);
- 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 + " ");
大数的使用
- 定义BigInteger类型可以使用实例化类的方法,也可以使用BigInteger中的valueOf(数字/变量)
BigInteger a = new BigInteger("3");
BigInteger b = BigInteger.valueOf(3);
int i = 788;
BigInteger c = BigInteger.valueOf(i);
- 大数的类是在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类
- 可以求sqrt(平方根)、abs(绝对值)、max、min、pow(幂)、取整(ceil、floor、round)具体查阅API
- 输出一个随机数用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
}
模板
公因公倍数
- 求最大公约数可以采用辗转相除法,就是两数的最大公约数就是较小数和两数余数的最大公约数
- 最小公倍数等于两数的乘积除最大公约数
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);