>java万能头文件
import java.util.*;
> nextLine连用的坑
- next
- nextInt
- nextDouble
- nextFloat
这些函数与nextLine连用都会有坑:next系列的函数返回了数据后,会把回车符留在缓冲区,因此我们下一次使用nextLine的时候就会碰到读取空字符串的情况
补充:next()读取过滤空格键 nextLine()会连空格键一起读取
解决方案:
- 都用nextLine,做格式转换
- 调用next系列函数后,中间调用一次nextLine去掉回车符后,再调用一次nextLine读取
//eg1 :
Scanner in = new Scanner(System.in);
int num = Integer.parseInt(in.nextLine()); //格式转换
String str = in.nextLine;
//eg2 :
Scanner in = new Scanner(System.in);
int num = in.nextInt();
in.nextLine();
String str = in.nextLine();
> 在小规模处理中,swith效率会比hash快
> 二分查找
- mid=(left+right)>>1的含义
右移运算符>>,运算结果正好能对应一个整数的二分之一值,这就正好能代替数学上的除2运算,但是比除2运算要快。
mid=(left+right)>>1相当于mid=(left+right)/2 - mid写成 l+(r-l)/2 而非 (l+r)/2
当数组元素很多时,(l+r)计算结果可能会大于INT_MAX,导致溢出
> ASCII码
- 空格的ASCII码为32
- 0~9的ASCII码为48~57
- A~Z的ASCII码为65~90
- a~z的ASCII码为97~122
> 求min之类先定的值
int ans = Integer.MAX_VALUE;
> 字符串位数转换限制
在 Java 中:
- 如果字符串超过 33 位,不能转化为 Integer
- 如果字符串超过 65 位,不能转化为 Long
- 如果字符串超过 500000001 位,不能转化为 BigInteger
> 判断重复字符
- 可以用一种数据结构来判断是否有重复的字符,常用的数据结构为哈希集合(即 C++ 中的 std::unordered_set,Java 中的 HashSet,Python 中的 set, JavaScript 中的 Set)。
- 在左指针向右移动的时候,我们从哈希集合中移除一个字符,在右指针向右移动的时候,我们往哈希集合中添加一个字符。
> 位运算符 & ~ | ^
位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”,分别用”&”、”~”、” | “、”^”。其中:
- 与运算(&)两个操作数的位都为 1,结果才为 1,否则结果为 0。
- 非运算(~)的操作数的位如果为 0,结果是 1,如果为 1,结果是 0。
- 或运算(|)两个操作数的位只要有一个为 1,那么结果就是 1,否则就为 0。
- 异或运算(^)的两个操作数的位相同时结果为 0,不同时结果为 1。
if (right1 == null ^ right2 == null) { return false; }
eg:此处要取得情况是 right1 == null && right2 != null || right1 != null && right2 == null
可用异或运算 right1 == null ^ right2 == null 巧妙处理
> 最短/长问题思路
最短距离——BFS(广度优先遍历)
最长距离——DFS(深度优先遍历)
> BFS(广度优先遍历)
BFS 使用队列,把每个还没有搜索到的点依次放入队列,然后再弹出队列的头部元素当做当前遍历点。BFS 总共有两个模板:
1.如果不需要确定当前遍历到了哪一层:
while queue 不空:
cur = queue.pop()
for 节点 in cur的所有相邻节点:
if 该节点有效且未访问过:
queue.push(该节点)
2.如果要确定当前遍历到了哪一层:
这里增加了 level 表示当前遍历到二叉树中的哪一层了,也可以理解为在一个图中,现在已经走了多少步了。size 表示在当前遍历层有多少个元素,也就是队列中的元素数,我们把这些元素一次性遍历完,即把当前层的所有元素都向外走了一步。
level = 0
while queue 不空:
size = queue.size()
while (size --) {
cur = queue.pop()
for 节点 in cur的所有相邻节点:
if 该节点有效且未被访问过:
queue.push(该节点)
}
level ++;