前记
刷了这几年的题,总体还是比较简单的,就是有些填空题比较坑,总结一下题型和技巧。
注意 scanner.close();
等代码规范,以免出现意想不到的事。毕竟不是项目,代码丑也没人看。
题型
结果填空、代码填空、程序设计
结果填空
先看懂题目,确定暴力能出结果的直接暴力跑。
有些就是小学初中的题目,套公式跑,减少出错几率。
日期类
日期类问题最好用Java的Calendar类,比如2017年的第1个大题。
涉及到闰年判断,月份判断,很容易做错,直接使用Calendar类判断日期对不对就很快做完了。
日期检查1 2 3 4 5 6 7 8 9 10 11
| try { Calendar calendar = Calendar.getInstance(); calendar.setLenient(false); calendar.set(2017, 1, 29); calendar.get(Calendar.YEAR); } catch (Exception e) { System.out.println(false); }
|
比如:
高斯出生于:1777年4月30日。
高斯获得博士学位的那天日记上标着:8113,
表示那一天是高斯出生后的第8113天,问年月日? 1799-7-16
1 2 3 4
| Calendar calendar = Calendar.getInstance(); calendar.set(1777, 4, 30); calendar.add(calendar.DATE, 8113); System.out.println(calendar.get(Calendar.YEAR) + "-" + calendar.get(Calendar.MONTH) + "-"+ calendar.get(Calendar.DAY_OF_MONTH));
|
其他
有些题目有去重的要求的,比如镜像和旋转,一定要注意排除掉,最好动手画画,确定是题目说的情况。
遇到除法的最好转成乘法,避免转换为浮点数。
代码填空
这些题基本就是回溯、动态规划、递归、广度/深度优先搜索等,一般是填1句代码的。
没什么诀窍,复制到IDE里,然后确定题型:
回溯:改变后又变回来,如:a=1; f(n); a=0;
动态规划:一维二维数组中涉及前面的状态,如:a[i] = a[i-1];
广度:“至少”等字眼
深度:和递归类似
在半懵逼下,多放几个断点,跟着程序走一下,看看能不能找到缺的是什么。
程序设计
回溯,动态规划,前缀和,广度/深度搜索,线段树,扫描线,数学常用定理:欧几里德。
看懂题目,确定题型会做,增加多几个自己手算的样例,避免失分。
代码基本模版,替代Scanner,这个输入输出流更快:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer;
public class Main { public static void main(String[] args) throws IOException { StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
while (in.nextToken() != StreamTokenizer.TT_EOF) { int a = (int) in.nval;
in.nextToken(); int b = (int) in.nval;
in.nextToken(); String c = in.sval;
out.println(a + b + c); out.flush(); } } }
|
总结
好好刷一个月题,重点理解上面说到的内容,拿个省奖是没问题的,去不去得了北京旅游就得看造化了。