【LeetCode】906、超等回文数

打印 上一主题 下一主题

主题 1844|帖子 1844|积分 5532

【LeetCode】906、超等回文数

  

一、通过数据量猜解法 罗列 数学 回文

1.1 通过数据量猜解法 罗列 数学 回文

减小数据规模: 先构成回文, 再平方, 再判断是否是范围内的回文数
缩小数据范围: 回文种子 => 回文数(即根号) => 数字(即根号的平方)
  1. // go
  2. func superpalindromesInRange(left string, right string) (ans int) {
  3.     l, _ := strconv.Atoi(left)
  4.     r, _ := strconv.Atoi(right) // 规模为10^18, 的数字
  5.     limit := int(math.Sqrt(float64(r))) // 规模为10^9, 的数字的根号
  6.     seed := 1 // 规模10^5, 的原初种子, 通过 回文 可构成 数字的根号
  7.     num := 0
  8.     for num <= limit {
  9.         // 原初种子 组成 偶数回文串
  10.         num = evenEnlarge(seed)
  11.         if isPalidromInRange(num*num, l, r) {ans++}
  12.         // 原初种子 组成 奇数回文串
  13.         num = oddEnlarge(seed)
  14.         if isPalidromInRange(num*num, l, r) {ans++}
  15.         // 原初种子 变大 继续后续遍历
  16.         seed++
  17.     }
  18.     return
  19. }
  20. // 是否是范围内的回文数
  21. func isPalidromInRange(num, l, r int) bool {
  22.     return num >= l && num <= r && isPalinrome(num)
  23. }
  24. // 把数字x变为偶数回文串, 如123变为123321
  25. func evenEnlarge(x int) int {
  26.     ans := x
  27.     for x > 0 {
  28.         ans = ans * 10 + x % 10
  29.         x /= 10
  30.     }
  31.     return ans
  32. }
  33. // 把数字x变为奇数回文串, 如123变为12321
  34. func oddEnlarge(x int) int {
  35.     ans := x
  36.     x /= 10 // x 先除以10, 如 123 变为 12
  37.     for x > 0 {
  38.         ans = ans * 10 + x % 10
  39.         x /= 10
  40.     }
  41.     return ans
  42. }
  43. // 数字x是否为回文数
  44. func isPalinrome(x int) bool {
  45.     if x < 0 {return false}
  46.     offset := 1
  47.     for x / offset >= 10 {
  48.         offset *= 10
  49.     }
  50.     for x != 0 {
  51.         if x/offset != x%10 {return false}
  52.         x = (x%offset)/10
  53.         offset /= 100
  54.     }
  55.     return true
  56. }
复制代码
参考左神 根据数据量猜解法
1.2 多语言解法

                                    C                         p                         p                         /                         G                         o                         /                         P                         y                         t                         h                         o                         n                         /                         R                         u                         s                         t                         /                         J                         s                         /                         T                         s                              Cpp/Go/Python/Rust/Js/Ts                  Cpp/Go/Python/Rust/Js/Ts
  1. // cpp
复制代码
  1. // go 同上
复制代码
  1. # python
复制代码
  1. // rust
复制代码
  1. // js
复制代码
  1. // ts
复制代码
二、打表法

先算出全部 0 到 10^18 范围内的 超等回文数, 因为总共只有84个数, 非常少, 以是可以提前存储好, 得到一个数组. PS: 此计算过程因为是单独准备的, 以是并不算在题目时间里
然后遍历每个提前存储好的数字, 判断是否 在 [l, r] 范围内即可
  1. func superpalindromesInRange(left string, right string) (ans int) {
  2.     // helper()
  3.     arr := []int{121 ,
  4.         1 ,
  5.         484 ,
  6.         4 ,
  7.         9 ,
  8.         1002001 ,
  9.         10201 ,
  10.         1234321 ,
  11.         12321 ,
  12.         14641 ,
  13.         4008004 ,
  14.         40804 ,
  15.         44944 ,
  16.         10000200001 ,
  17.         100020001 ,
  18.         10221412201 ,
  19.         102030201 ,
  20.         104060401 ,
  21.         12102420121 ,
  22.         121242121 ,
  23.         12345654321 ,
  24.         123454321 ,
  25.         125686521 ,
  26.         40000800004 ,
  27.         400080004 ,
  28.         404090404 ,
  29.         100000020000001 ,
  30.         1000002000001 ,
  31.         100220141022001 ,
  32.         1002003002001 ,
  33.         1004006004001 ,
  34.         102012040210201 ,
  35.         1020304030201 ,
  36.         102234363432201 ,
  37.         1022325232201 ,
  38.         1024348434201 ,
  39.         121000242000121 ,
  40.         1210024200121 ,
  41.         121242363242121 ,
  42.         1212225222121 ,
  43.         1214428244121 ,
  44.         123212464212321 ,
  45.         1232346432321 ,
  46.         123456787654321 ,
  47.         1234567654321 ,
  48.         400000080000004 ,
  49.         4000008000004 ,
  50.         4004009004004 ,
  51.         1000000002000000001 ,
  52.         10000000200000001 ,
  53.         1000220014100220001 ,
  54.         10002000300020001 ,
  55.         10004000600040001 ,
  56.         1002003004003002001 ,
  57.         10020210401202001 ,
  58.         1002223236323222001 ,
  59.         10022212521222001 ,
  60.         10024214841242001 ,
  61.         1020100204020010201 ,
  62.         10201020402010201 ,
  63.         1020322416142230201 ,
  64.         10203040504030201 ,
  65.         10205060806050201 ,
  66.         1022123226223212201 ,
  67.         10221432623412201 ,
  68.         1022345658565432201 ,
  69.         10223454745432201 ,
  70.         1210000024200000121 ,
  71.         12100002420000121 ,
  72.         1210242036302420121 ,
  73.         12102202520220121 ,
  74.         12104402820440121 ,
  75.         1212203226223022121 ,
  76.         12122232623222121 ,
  77.         1212445458545442121 ,
  78.         12124434743442121 ,
  79.         1232100246420012321 ,
  80.         12321024642012321 ,
  81.         1232344458544432321 ,
  82.         12323244744232321 ,
  83.         1234323468643234321 ,
  84.         12343456865434321 ,
  85.         12345678987654321 ,
  86.         4000000008000000004 ,
  87.         40000000800000004 ,
  88.         40004000900040004}
  89.     l, _ := strconv.Atoi(left)
  90.     r, _ := strconv.Atoi(right)
  91.     for _, v := range arr {
  92.         if v >= l && v <= r {ans++}
  93.     }
  94.     return
  95. }
  96. func helper() {
  97.     limit := int(1e9)
  98.     seed := 1 // 规模10^5, 的原初种子, 通过 回文 可构成 数字的根号
  99.     num := 0
  100.     for num <= limit {
  101.         // 原初种子 组成 偶数回文串
  102.         num = evenEnlarge(seed)
  103.         if isPalidromInRange(num*num) {fmt.Println(num*num, ",")}
  104.         // 原初种子 组成 奇数回文串
  105.         num = oddEnlarge(seed)
  106.         if isPalidromInRange(num*num) {fmt.Println(num*num, ",")}
  107.         // 原初种子 变大 继续后续遍历
  108.         seed++
  109.     }
  110. }
  111. // 是否是范围内的回文数
  112. func isPalidromInRange(num int) bool {
  113.     return isPalinrome(num)
  114. }
  115. // 把数字x变为偶数回文串, 如123变为123321
  116. func evenEnlarge(x int) int {
  117.     ans := x
  118.     for x > 0 {
  119.         ans = ans * 10 + x % 10
  120.         x /= 10
  121.     }
  122.     return ans
  123. }
  124. // 把数字x变为奇数回文串, 如123变为12321
  125. func oddEnlarge(x int) int {
  126.     ans := x
  127.     x /= 10 // x 先除以10, 如 123 变为 12
  128.     for x > 0 {
  129.         ans = ans * 10 + x % 10
  130.         x /= 10
  131.     }
  132.     return ans
  133. }
  134. // 数字x是否为回文数
  135. func isPalinrome(x int) bool {
  136.     if x < 0 {return false}
  137.     offset := 1
  138.     for x / offset >= 10 {
  139.         offset *= 10
  140.     }
  141.     for x != 0 {
  142.         if x/offset != x%10 {return false}
  143.         x = (x%offset)/10
  144.         offset /= 100
  145.     }
  146.     return true
  147. }
复制代码
参考左神 根据数据量猜解法

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

石小疯

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表