A
耗时间的大头在于素数的判断,所以要尽可能跳过不可能是回文数或素数的数字。开始的时候对这两种数字的数学特性不了解,卡了很久,后面查资料才知道原来有简洁的跳过方法。跳过的原理基于 2 个数学结论。
- 除了 11 以外的回文素数一定是奇数位。
- 6 倍原理。即大于 3 的素数只有可能是
或
。
整体的逻辑是先为 建 1 个映射,
时直接根据映射返回,
时,向上遍历时先用上面两个结论筛一遍,跳过不可能的数字后,再开始判断是否为回文数,然后判断是否为素数。素数判断方法可以通过计算
能否被
内数字整除来判断。
素数的判断上,可以尝试结合欧拉筛法来进一步提高效率?
顺便吐槽下,leetcode 上的题解上标注为官方的解答感觉并没有充分利用数学特性,里面两种解法,尤其是方法二,实质就是跳过了计算量大的一部分数据的穷举法。
R
Don’t Use Boolean Arguments, Use Enums
文章推荐用 enum 来代替 boolean ,因为 boolean 在很多时候的时候效果不是很好。
- 管理状态机的时候,容易导致代码的复杂度和层数问题
- 做为参数时,可读性不是很好
- 不易于扩展
enum 在这方面就要好很多,有如下优势。
- 名称清晰明了。从命名很容易理解含义
- 易于扩展和重构
- 类型安全
T
python 在计算乘方、平方和平方根的时候,如果使用方法去计算,通常会使用 pow() 和 sqrt() 来处理。但其实可以使用 ** 运算符来代替,x ** y 等效于 pow(x, y) ,并且因为 pow(x, .5) == sqrt(x) ,也可以用 x ** .5 来代替 sqrt(x) 。