每日一题——最大回文数乘积

简介: 每日一题——最大回文数乘积

479. 最大回文数乘积

题目描述:

给定一个整数 n,返回 可表示为 两个n位整数 乘积 的 最大回文整数 。

因为答案可能非常大,所以返回它对 1337 取余 。

例子1:

输入:n = 2

输出:987

解释:99 x 91 = 9009, 9009 % 1337 = 987

例子2:

输入: n = 1

输出: 9

题解:

超时:

func largestPalindrome1(n int) int {
  // eg: n=2
  min := int(math.Pow10(n - 1)) // 10
  max := int(math.Pow10(n) - 1) // 99
  // 存放每个数的最大回文乘积
  // eg:
  // n=2的时候
  // [1001 888 1001 868 585 848 969 828 1881 777 2112 1771
  // 2112 2002 999 2772 2552 2112 3003 2992 2772 3663 3003
  // 2772 4224 4554 4224 3773 4004 4664 5445 4774 6336 5005
  // 6336 6336 7227 5775 7007 8118 8448 9009]
  var AllPalindromeMaxSlice []int
  for i := min; i <= max; i++ {
    // 记录当前数的与其他数的乘积 为回文数的 结果
    var myPalindrome []int
    j := i
    for j <= max {
      if palindrome(i * j) {
        myPalindrome = append(myPalindrome, i*j)
      }
      j++
    }
    if len(myPalindrome) == 0 {
      continue
    }
    AllPalindromeMaxSlice = append(AllPalindromeMaxSlice, myPalindrome[len(myPalindrome)-1])
  }
  sort.Ints(AllPalindromeMaxSlice)
  if len(AllPalindromeMaxSlice) == 0 {
    return 0
  }
  return AllPalindromeMaxSlice[len(AllPalindromeMaxSlice)-1] % 1337
}
func palindrome(x int) bool {
  t := x
  c := 0
  // 数值反转
  for t > 0 {
    // t%10 取个位
    c = c*10 + t%10
    // 抛弃个位
    t = t / 10
  }
  return c == x
}

正解:

func largestPalindrome(n int) int {
  // n = 1
  // 1-->9 1~81
  // 77 66 55 44 33 22 11
  // 可以看到这些都是1个一位数和1个二位数的乘积,不满足题意
  if n == 1 {
    return 9
  }
  // 上下界限
  upperBound := int(math.Pow10(n)) - 1
  lowerBound := upperBound/10 + 1
  // 最大值
  maxNumber := upperBound * upperBound   // 9801
  half := maxNumber / int(math.Pow10(n)) // maxNumber的前半部分 9889 ———> 98
  // 是否找到了回文串
  found := false
  // 结果
  res := 0
  for !found {
    res = createPalindrome(half)
    // 从高往低去看
    for i := upperBound; i >= lowerBound; i-- {
      // 意味着在遍历过程中i的值太小了
      if i*i<res {
        break
      }
      if res%i==0 {
        found = true
        break
      }
    }
    half--
  }
  return res % 1337
}
// 根据左半部分生成回文串
func createPalindrome(half int) int {
  t := half
  for x := half; x > 0; x /= 10 {
    t = t*10 + x%10
  }
  return t
}
相关文章
|
18天前
【LeetCode刷题】两数之和、两数相加
【LeetCode刷题】两数之和、两数相加
|
2月前
|
存储 测试技术 索引
每日一题——除自身以外数组的乘积
每日一题——除自身以外数组的乘积
|
11月前
|
存储 人工智能 测试技术
【AcWing每日一题】4644. 求和
【AcWing每日一题】4644. 求和
59 0
|
2月前
|
算法 Java C#
Leetcode算法系列| 9. 回文数
Leetcode算法系列| 9. 回文数
|
10月前
|
存储
每日一题(两数相加)
每日一题(两数相加)
|
Java Python
leetcode每日一题.445:两数相加II
leetcode每日一题.445:两数相加II
67 0
|
存储 算法
算法练习:回文数
算法练习:回文数
102 0
LeetCode每日一题(1)——最大回文数乘积
LeetCode每日一题(1)最大回文数乘积 1.题目 2.示例 3.思路 1.生成位数符合要求的递减的回文数 2.判断回文数是否符合要求 4.代码 5.复杂度分析
|
机器学习/深度学习 Java
LeetCode——479. 最大回文数乘积
LeetCode——479. 最大回文数乘积
72 0
LeetCode每日一题——479.最大回文数乘积
给定一个整数 n ,返回 可表示为两个 n 位整数乘积的 最大回文整数 。因为答案可能非常大,所以返回它对 1337 取余 。
82 0