语法
import java.io.*;
public static void main(String[] args) throws IOException {
BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(System.out));
// input
n = Integer.parseInt(re.readLine());
String[] a = input.readLine().trim().split("\\s+");
for (int i = 0; i < n; i++) q[i] = Integer.parseInt(a[i]);
......
// output
wr.write(res + "\n");
wr.flush();
// 无给出输入数量
while (sc.hasNext()) {
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a + b);
}
String str;
while ((str = re.readLine()) != null) {
String[] strs = str.split(" ");
int a = Integer.parseInt(strs[0]);
int b = Integer.parseInt(strs[1]);
wr.write(a + b + "\n");
}
}
BufferReader
比采用Scanner
更快,一次读入一行,然后用字符串解析的方式来处理输入
BufferWriter
比采用System
更快,需要转换尾字符串写入,最后刷新缓冲区
wr.write()
参数不接受数字,特别注意需要转换wr.write(1 + "")
char[] s = (" " + sc.next()).toCharArray()
可以得到下标从1开始的字符串
int[] a = new int[]{0, 1}; int[] a = {0, 1}
这两种方式都可以用于声明字面量数组
java没有do while
语句,即先至少执行一次再判断,可以使用while(true){ break;}
的方式来实现该逻辑
链表
对于链表中头节点可能会变,可能不变的题目,采用虚拟头节点的方法
ListNode dummy = new ListNode();
dummy.next = head;
递归
定义递归问题抽象时,采用树的方式来辅助思考。
递归是否返回值:
- 有返回值,在递归出口使用
return
, 则递归调用时也需直接返回return func();
, 否则递归调用无返回值。 - 无返回值,则要采用
if {递归出口} else {递归调用}
来防止执行完递归出口部分代码后,仍然向下执行。
dfs
采用List<Node> path
来保存,从根节点到叶节点的一条搜索路径。
每次遍历一个节点的分支,然后向下搜索一个分支(直到遇到叶节点),然后向上回溯搜索下一个分支
该过程要注意恢复现场:
- 标记在访问后需要擦除
path
在访问过后需要删除,保证path
始终存储的为一条搜索路径
数学
$\lceil \frac{a}{b} \rceil = \lfloor \frac{a + b - 1}{b} \rfloor$
map
对于统计出现个数和是否出现过,都可以使用map
来使得访问的效率为$O(1)$
如:
两数之和:判断数组中是否存在两个数之和为$C$
暴力:对每个数都遍历一整遍数组$O(n^2)$
优化:可以在扫描的过程中用map
对每个数进行记录$O(n)$
当使用map<Integer, Integer>
时,使用long
查询时不会进行隐式地转换,尽管字面量值相等
去除前导0
去除前导0不能够将最后一位删除,if (check(0) && i < size) remove(i)
字符串
当字符串中的种类是有限的,如a~z
0~9
可以考虑直接枚举所有字符,时间复杂度为常数级别
多次轮询
对于多次轮询的优化,常用的方法是预处理一遍
从而能够将最大的数据范围内的中间结果或者最终的答案计算出来
区间长度
给出端点,求区间长度的常有方法是使用last
维护上一个端点
last = -1;
for (int k : keySet()) {
if (last != -1) len = k - last;
last = k;
}
枚举
枚举满足可能的结果,从两方面进行思考、
- 枚举所有的可能,判断是否满足条件
- 对所有满足结果的数进行构造,判断是否在搜索的范围内
从当中选取满足时间复杂度,较为容易实现的那一个
动态规划
注意定义最大值时使用1e9
而不是Integer.MAX_VALUE
,后者有可能导致溢出
好棒
自用,不一定准确