开启我的LeetCode刷题日记:564. 寻找最近的回文数

198 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

今天题目:564. 寻找最近的回文数

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

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

 

示例 1:

输入: n = "123" 输出: "121" 示例 2:

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

提示:

1 <= n.length <= 18 n 只由数字组成 n 不含前导 0 n 代表在 [1, 1018 - 1] 范围内的整数

我的思路

模拟数字的+1和-1过程,再判断是否是回文,返回最快成为回文的字符串 基本思路只+1和-1的话很明显会超时,那么我们可以放大1这个值

比如1231,我们可以+10和-10,最终得到1331和1221,再根据题意获取最近的值即可

代码实现

var nearestPalindromic = function (n) {
    const bit = BigInt(n);
    const nums = [bit - 1n, bit + 1n];
    while (true) {
        const d1 = getDistance(nums[0]);
        if (d1 === 0) break;
        nums[0] -= BigInt(d1);
    }
    while (true) {
        const d2 = getDistance(nums[1]);
        if (d2 === 0) break;
        nums[1] += BigInt(d2);
    }
    return bit - nums[0] <= nums[1] - bit ? String(nums[0]) : String(nums[1])
};

function getDistance(n) {
    const s = n + '';
    let i = 0;
    let j = s.length - 1;
    while (i < j) {
        if (s[i++] !== s[j--]) return 10 ** (i - 1);
    }
    return 0;
}



总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹