「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
模拟方法
模拟算法是模拟人在解决这类问题的思想,将问题简化为简单重复的计算过程;然后使用代码代替人计算这些简单重复的计算过程的一种思路;
通过模拟方法分析本题:
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】字符串完全相同,所以反转一半字符串即可完成
写在最后
其实理解题意,用什么方法都可以解决,重要的是理解;明白各个方法的复杂度;
一道简单题;理解就好