2022-02-17:寻找最近的回文数。 给定一个表示整数的字符串 n ,返回与它最近的回文整数(不包括自身)。如果不止一个,返回较小的那个。 “最近的”定义为两个整数差的绝对值最小。 示例 1: 输入: n = "123"; 输出: "121"。 力扣564。

答案2022-02-17:

粗回文,中间位置加1或减1或不变。coding难点在进位和借位。

代码用golang编写。代码如下:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    n := "123"
    ret := nearestPalindromic(n)
    fmt.Println(ret)
}

func nearestPalindromic(n string) string {
    num, _ := strconv.Atoi(n)
    raw := getRawPalindrome(num)
    big := 0
    if raw > num {
        big = raw
    } else {
        big = getBigPalindrome(raw)
    }
    small := 0
    if raw < num {
        small = raw
    } else {
        small = getSmallPalindrome(raw)
    }
    if big-num >= num-small {
        return fmt.Sprint(small)
    } else {
        return fmt.Sprint(big)
    }
}

func getRawPalindrome(n int) int {
    chs := []byte(fmt.Sprint(n))
    len0 := len(chs)
    for i := 0; i < len0/2; i++ {
        chs[len0-1-i] = chs[i]
    }
    ret, _ := strconv.Atoi(string(chs))
    return ret
}

func getBigPalindrome(raw int) int {
    chs := []byte(fmt.Sprint(raw))
    res := make([]byte, len(chs)+1)
    res[0] = '0'
    for i := 0; i < len(chs); i++ {
        res[i+1] = chs[i]
    }
    size := len(chs)
    for j := (size-1)/2 + 1; j >= 0; j-- {
        res[j]++
        if res[j] > '9' {
            res[j] = '0'
        } else {
            break
        }
    }
    offset := 0
    if res[0] == '1' {
        offset = 1
    }
    size = len(res)
    for i := size - 1; i >= (size+offset)/2; i-- {
        res[i] = res[size-i-offset]
    }
    ret, _ := strconv.Atoi(string(res))
    return ret
}

func getSmallPalindrome(raw int) int {
    chs := []byte(fmt.Sprint(raw))
    res := make([]byte, len(chs))
    size := len(res)
    for i := 0; i < size; i++ {
        res[i] = chs[i]
    }
    for j := (size - 1) / 2; j >= 0; j-- {
        res[j]--
        if res[j] < '0' {
            res[j] = '9'
        } else {
            break
        }
    }
    if res[0] == '0' {
        res = make([]byte, size-1)
        for i := 0; i < len(res); i++ {
            res[i] = '9'
        }
        if size == 1 {
            return 0
        } else {
            ret, _ := strconv.Atoi(string(res))
            return ret
        }
    }
    for k := 0; k < size/2; k++ {
        res[size-1-k] = res[k]
    }
    ret, _ := strconv.Atoi(string(res))
    return ret
}

执行结果如下: 图片


左神java代码