leetcode 回文系列题解(1)

656 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

9.回文数

模拟方法

模拟算法是模拟人在解决这类问题的思想,将问题简化为简单重复的计算过程;然后使用代码代替人计算这些简单重复的计算过程的一种思路;

通过模拟方法分析本题:

1、根据“回文数”的定义,负数肯定不是回文;因为负号(-)字符串反转后肯定没有对应的自负,所以在判断是否回文的时候,直接讲负数排除;

2、如果正数且是回文;一定有数字第一位与数字最后一位相同,数字第二位与数字倒数第二位相同;可以通过双指针left和right;left指向字符串开始,right指向字符串结束;必然后s[lefe] === s[right]

3、当出现s[lefe] 不等于 s[right] 该字符串一定不是回文字符串;

根据上述思路,可以编辑代码如下

代码

var isPalindrome = function(x) {
    if(Number(x) < 0) return false;
    x = String(x)
    let l = 0;
    let r = x.length-1;
    while(l < r){
        if(x[l] !== x[r]) return false;
        l++;
        r--
    }
    return true
};

借用字符串反转

回文,将数字反转与原数字对比,相同即为回文数字

var isPalindrome = function(x) {
    if(Number(x) < 0) return false;
    x = String(x)
    return x === x.split('').reverse().join('')
};

分析

将数字转换为字符串,并检查字符串是否为回文。这需要额外的O(n)量空间来存放字符串的 所以使用了空间复杂度将会达到O(n)级别

反转一半字符串

在模拟法,中我们讲全部的字符串反转然后与自身对比;仔细思考其实可以不必反转全部字符串;

如果该数字是回文,其后半部分反转后应该与原始数字的前半部分相同;

比如:数字【3456543】反转一半,【5436】与剩余未反转部分【543】前3个字符是相同的,至于第4个可以作为中间值;

比如:数组【345543】反转一半,【543】与剩余未反转部分【543】字符串完全相同,所以反转一半字符串即可完成

写在最后

其实理解题意,用什么方法都可以解决,重要的是理解;明白各个方法的复杂度;

一道简单题;理解就好