564. 寻找最近的回文数

寻找最近的回文数

题目描述:

给定一个表示整数的字符串 n ,返回与它最近的回文整数(不包括自身)。如果不止一个,返回较小的那个。

“最近的”定义为两个整数差的绝对值最小。

示例 1:

输入: n = “123”
输出: “121”
示例 2:

输入: n = “1”
输出: “0”
解释: 0 和 2是最近的回文,但我们返回最小的,也就是 0。

提示:

1 <= n.length <= 18
n 只由数字组成
n 不含前导 0
n 代表在 [1, 1018 - 1] 范围内的整数
通过次数11,931提交次数45,674

思路:

例如对于 abcdeabcde 来说,最近的回文数值的前三位可能是 abcabc、abc+1abc+1 和 abc-1abc−1 三者之一,其他位置的数值随着前三位的确定而唯一确定。还有特殊的情况得9999和10001里面选一个最接近的数。

代码:

import "strconv"
func nearestPalindromic(n string) string {
    m := len(n)
    if m == 1{
        return string(n[0]-1)
    }
    candidates := []int{int(math.Pow10(m-1)) - 1, int(math.Pow10(m)) + 1}
    selfPrefix, _ := strconv.Atoi(n[:(m+1)/2])
    for _,x := range []int{selfPrefix,selfPrefix+1,selfPrefix-1} {
        y := x
        if m % 2 == 1{
            y /= 10
        }
        for ;y>0;y/=10{
            x = x*10 + y %10
        }
        candidates = append(candidates, x)
    }
    ans := -1
    num,_ := strconv.Atoi(n)
    for _,x := range candidates{
        if x != num && (ans == -1 ||  abs(ans-num) > abs(x - num) || (abs(ans-num) == abs(x - num) && x < ans)) {
            ans = x
        }
    }
    return strconv.Itoa(ans)

}

func abs(n int)int{
    if n <0{
        return -n
    }
    return n
}

代码效率:

执行用时:4 ms, 在所有 Go 提交中击败了11.11%的用户
内存消耗:1.9 MB, 在所有 Go 提交中击败了88.89%的用户


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!