1.数字题
特殊的输入:
1)是否考虑错误的输入?错误输入的处理?(空格、非法字符)
2)0, 负数, 小数?
3)数据大小,类型范围:INT_MAX:0x7fff ffff INT_MIN:0x8000 0000(INT_MAX和INT_MIN绝对值差1)
一些trick:
1)溢出long long
2)浮点转int int(f+0.0000001)
3)mod : (a+base-x) % base
7. Reverse Integer
8. String to Integer (atoi)
2.数学题
2.1 幂相关的问题
1)二进制:如果是2的幂,则n & (n-1)为0
2)342:根据231进行改进,过滤掉所有奇数位的1,只保留偶数位的1——0x55555555
3)big3 =pow(3, log(INT_MAX)/log(3));能被最大的big3整除,则一定是3的幂。因为big3所有因子均是3。
231. Power of Two
326. Power of Three
342. Power of Four
2.2 根二进制有关
1)n & (n-1)会去掉最低位的1,上面的231和342也属于此类
2.3 reverse反转类题目
2.4 特征分析题
172. Factorial Trailing Zeroes
172应用到的是数字规律
204. Count Primes
204是数论题,应用到是筛法!
258. Add Digits
258应用到的是数字规律分析:abc = a100 + b10 +c以及(num - 1)%9 + 1
268. Missing Number
268用到的是a = abb
3.博弈论——游戏题
状态转移法:找到初始状态和关键状态(292是必输状态,此时这种状态怎么走都是输)。并找到状态转移的关系。
292. Nim Game
1)关键状态
如果n存在一种方式一步到达必输状态:
存在x,f[n-x]为必输,其中1 <= x <= 3,那么f[n]则是必胜
不存在这种x就是必输状态
2)初始状态:f[0]必输,f[1]f[2]f[3]是必胜,f[4]必输,f[5]f[6]f[7]必胜
3.1 扩展1
a[0] ... a[n -1]可以取,写出一个这种题目的通用方式
vector<int> f(n + 1, 必输);
for (int i = 0; i < n; ++i) {
if (f[i] 必输) {
for (int j = 0; j < a.size(); ++j) {
f[i + a[j]] = 必胜;
}
}
}
return f[n];
3.2 扩展2
两个石子一堆A个,一堆B个,甲乙两个人取石子,每次2种取法:
从任意一堆里面取走任意个;从AB中取走相同的个数。取走最后的一个获胜。
f[0][0]必输,f[x][0] f[0][x] f[x][x]必胜。