1.输入
推荐使用这种的输入,读取的数据量大的时候,速度更快。
static class InputReader { private BufferedReader bf = null; private StringTokenizer stz = null; public InputReader() { bf = new BufferedReader(new InputStreamReader(System.in),32*1024); } public boolean hasNext() { while(stz == null || !stz.hasMoreTokens()) { try { stz = new StringTokenizer(bf.readLine()); } catch (IOException e) { return false; } } return true; } public String next() { if(hasNext()) { return stz.nextToken(); } return null; } public int nextInt() { return Integer.parseInt(next()); } public double nextDouble() { return Double.parseDouble(next()); } }
2.进制转换
十进制转换成n进制
InputReader sc = new InputReader(); int num = sc.nextInt(); System.out.println(Integer.toString(num, 16));//这里是转成16进制
n进制转换成十进制
InputReader sc = new InputReader(); String str = sc.next(); System.out.println(Integer.valueOf(str, 16));//这里代表字符串使用16进制表示的
以上处理的进制问题没有考虑溢出问题。也就是某个进制代表的数字很大,int类型不足以表示
n进制转换十进制(推荐)
InputReader sc = new InputReader(); String str = sc.next(); BigInteger bigInteger = new BigInteger(str, 16); System.out.println(bigInteger);
3. 日期运算(Calendar的API使用)
真题:世纪末的星期
1999年的12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即xx99年)的12月31日正好是星期天(即星期日)?
请回答该年份(只写这个4位整数,不要写12月31等多余信息)。
public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); for (int i = 1999; i < 10000; i+=100) { calendar.set(i, 11, 31);//月份从0开始计算 if(calendar.get(Calendar.DAY_OF_WEEK) == 1) { System.out.println(i); //2299 break; } } }
4.递归
递归就是思考解决问题的方向是自顶向下的
4.1. 最常用的递归就是全排列
public static void main(String[] args) { String[] arr = new String[] {"A","B","C"}; int n = arr.length; recursion(arr,0,n); } private static void recursion(String[] arr,int start,int end) { if(start == end) { print(arr); return; } for (int i = start; i < end; i++) { Utils.swap(arr, i, start); // Arrays.sort(arr,start+1,end); recursion(arr,start+1,end); Utils.swap(arr, start, i); } } private static void print(String[] arr) { for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]); } System.out.println(); }