leetcode-数字数论题

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也属于此类

191. Number of 1 Bits

2.3 reverse反转类题目

190. Reverse Bits

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 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]必胜。

你可能感兴趣的:(leetcode-数字数论题)