目录
1,题目
给你一个整数 x
,如果 x
是一个回文整数,返回 true
;否则,返回 false
。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 例如,
121
是回文,而123
不是。
2,代码
2.1利用字符串和数组转换
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
// 转化为字符串后分割为字符数组
const arr = x.toString().split('');
// 创建一个新数组作为反转后的数组,以避免修改原数组
const arr2 = [...arr].reverse();
// 比较原数组和反转后的数组组成的字符串是否相同
return arr.join('') === arr2.join('');
};
2.2翻转一半数字
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if(x < 0 ||(x % 10 === 0 && x != 0)){
return false;
}
let reverseNumber = 0;
while(x > reverseNumber){
reverseNumber = reverseNumber * 10 + x % 10;
x = Math.floor( x/10 );
}
// 如果数是奇书长度,则通过Math.floor(reverseNumber/10)来处理掉中位数
// 这里逻辑是和 x>reverseNumber 保持一致
return x === reverseNumber || x === Math.floor(reverseNumber/10);
};
3,学习与总结
方法2.1的纠错
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
// 先转化为字符串
const arr = x.toString().split();
const arr2 = arr.reverse();
return arr.join('') === arr2.join('');
};
错误点分析:
-
当使用
split()
方法时,如果你的目标是将字符串分割成单个字符组成的数组,你需要传入一个空字符串作为参数。在原代码中,split()
没有传入参数,这将不会按预期分割字符串。 -
arr.reverse()
方法会就地(in-place)反转数组,也就是说它直接修改原数组。将arr.reverse()
的结果赋值给arr2
并不会创建一个新的数组副本;arr
和arr2
实际上会引用同一个数组对象。因此,当你比较arr.join('')
与arr2.join('')
时,你实际上是在比较两个相同的字符串。
方法2.2的学习
- 临界情况的处理:负值不是回文数;最低位是0且最高位不是0的不是回文数;
- 后几位数字的翻转逻辑
- 反转数字的位数已经达到原始数字位数一半的判断:整个过程都在对原始数进行除以10的操作,并给反转后的数乘以10的操作,当原始数小于或者等于反转后的数字时,意味着我们已经处理了数字的一半长度。
连续打卡再次中断,记录一下消失的原因:去背八股文了!
勉励自己:贵在坚持!