ARTS - 3

120 阅读2分钟

A


866. 回文素数

耗时间的大头在于素数的判断,所以要尽可能跳过不可能是回文数或素数的数字。开始的时候对这两种数字的数学特性不了解,卡了很久,后面查资料才知道原来有简洁的跳过方法。跳过的原理基于 2 个数学结论。

  1. 除了 11 以外的回文素数一定是奇数位。
  2. 6 倍原理。即大于 3 的素数只有可能是 6k+16k+5

整体的逻辑是先为 N \in [0, 11] 建 1 个映射, N \leq 11 时直接根据映射返回, N > 11 时,向上遍历时先用上面两个结论筛一遍,跳过不可能的数字后,再开始判断是否为回文数,然后判断是否为素数。素数判断方法可以通过计算 N 能否被 [2, \sqrt[2]{N}] 内数字整除来判断。

素数的判断上,可以尝试结合欧拉筛法来进一步提高效率?

顺便吐槽下,leetcode 上的题解上标注为官方的解答感觉并没有充分利用数学特性,里面两种解法,尤其是方法二,实质就是跳过了计算量大的一部分数据的穷举法。

R


Don’t Use Boolean Arguments, Use Enums

文章推荐用 enum 来代替 boolean ,因为 boolean 在很多时候的时候效果不是很好。

  1. 管理状态机的时候,容易导致代码的复杂度和层数问题
  2. 做为参数时,可读性不是很好
  3. 不易于扩展

enum 在这方面就要好很多,有如下优势。

  1. 名称清晰明了。从命名很容易理解含义
  2. 易于扩展和重构
  3. 类型安全

T


python 在计算乘方、平方和平方根的时候,如果使用方法去计算,通常会使用 pow()sqrt() 来处理。但其实可以使用 ** 运算符来代替,x ** y 等效于 pow(x, y) ,并且因为 pow(x, .5) == sqrt(x) ,也可以用 x ** .5 来代替 sqrt(x)

S


Android X + viewBindng + viewModel + kotlin 的初步使用