前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >2022-02-17:寻找最近的回文数。 给定一个表示整数的字符

2022-02-17:寻找最近的回文数。 给定一个表示整数的字符

原创
作者头像
福大大架构师每日一题
发布2022-02-17 21:44:15
发布2022-02-17 21:44:15
3510
举报

2022-02-17:寻找最近的回文数。

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

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

示例 1:

输入: n = "123";

输出: "121"。

力扣564。

答案2022-02-17:

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

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

代码语言:go
复制
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代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档