遍历数组、哈希表:
for(int num : ans2)
后面 num 直接代替ans2[i]
两个数一位一位相加,若两数不一样长,前面补0,设一个进位
运算不停的条件:i>=0 || j>=0 || add!=0 ( 进位 )
Integer.bitCount(i) ----> i 的二进制表示中 1 的个数
二进制中1的个数(一比特数):
对于任意整数 x,令 x=x & (x−1) , 该运算将 x 的二进制表示的最后一个 1 变成 0。因此,对 x 重复该操作,直到 x 变成 0,则操作次数即为 x 的「一比特数」
(i&(i-1))==0 i 是 2 的整数次幂(0,1,2,4,8,16,32......)
滑动窗口:
left right
w = left 到 right 之间的和
w = w - left 的值
w = w + right 的值
数组:
int[] factors = {2,3,5};
for(int factor : factors) ----->factor为 2,3,5 之一
Arrays.copyOfRange(ans,0,i) -----> 将数组 ans 的第 0 到第 i 个元素以数组的形式输出
Arrays.sort(nums); ---->把数组nums排序
两组数字 / 字母:一个比另一个多一个数字 / 字母 ---->分别求和,再相减
字符串
String s;
s.length(); 长度
s.charAt(i); 第i个字符
charactor.isLetterOrDigit(s.charAt(i)); 第i个字符是否为字母/数字,是:1,不是:0
charactor.toLowerCase(s.charAt(i)); 将第i个字符转为小写字母并返回
s.substring(a,b); s中(0起)a <= x < b 的字符
String[] words = s.split(" "); ------>把s里的空格去掉,提取成一个个单词(根据空格,提取单词)
char[] arr=s.toCharArray(); ----> 把字符串s 转换成字符数组arr,这样好取每个字符,好改变
return new String(arr);
List<String> abc = new ArrayString<String>(); ----> 一行?一组?
List<List<Integer>> C = new ArrayList<List<Integer>>(); ----> 类似于二维数组
abc.add(1); 1加进abc这行
C.get(i-1).get(j); C的第 i - 1 行,j 列 那个值
C.get(rowIndex); 取C这个二维数组的第rowindex行的数组
颠倒整数n : Integer.reverse(n)
sb.reverse(); 翻转
sb.toString(); 转换为字符串
队列相关:
LinkedList 里封装双向链表(是个集合)
Queue<Integer> q1= new LinkedList<Integer>();
q1.offer(x) ----> x入队
q1.isEmpty() ----> 队q1是否为空,空返回1,非空返回0
q1.poll() ----> q1队首出队
q1.peek() ----> 获得q1队首元素
栈相关:
Deque<Integer> inStack = new ArrayDeque<Integer>();
inStack.push(x); ----> x入栈
inStack.isEmpty(); ----> 栈是否为空,空返回true,非空返回false
inStack.pop(); ----> 栈顶出队
inStack.peek(); ----> 获得栈顶元素
哈希表
Set<Integer> ans = new HashSet<Integer>();
if ( ! ans.add(i)) i加不进去 ------->i重复了
ans.size() ---->长度大小
ans.add(1)
ans1.contains(i) ----> 包含
哈希表
Map<Character,Character> s2t = new HashMap<Character,Character>();
s2t.containsKey(x) ---->s2t这个哈希表里有x
s2t.get(x)!=y ---->哈希表里x对应的不是y
s2t.put(x,y); ---->把x对应y这个对应放入s2t哈希表
s2t.getOrDefault(num,0) ---->哈希表里有没有num ? 有的话返回num对应的值,没有返回0
s2t.values() ------> 获取到Map中的所有值(第二行的所有值)
eg. for(int v : map.values()) ---->可以遍历了
按位异或 ^ : a ^ 0 = a a ^ a = 0
int 最大最小: Integer.MAX_VALUE Integer.MIN_VALUE
res > Integer.MAX_VALUE/10 || ( res == Integer.MAX_VALUE / 10 && num > Integer.MAX_VALUE % 10))
res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && - num < Integer.MIN_VALUE % 10)
int型的出界
long最大最小:Long.MIN_VALUE Long.MAX_VALUE
数组:
left right mid=(left+right)/2
int mid = left + (right - left) / 2; // 防止计算时溢出
fast slow
有时候计算要用 long 否则超时