Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、题目描述:
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 例如,
121是回文,而123不是。
示例
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
提示:
-231 <= x <= 231 - 1
二、题解:
方法一 暴力颠倒法
- 原理。主要是通过数组的reverse()方法调换原字符串与之比较。
代码:
var isPalindrome = function(x) {
return String(x) === String(x).split('').reverse().join('')
};
方法二 循环判断法
- 原理。将每一次数组下标n的值和数组尾部倒数第n个对比(arr.length-1-n)。
- 优化。筛除0,小于0,10的倍数这些特殊案例在进行循环
tips: 使用类似双指针的方案,循环数组的一半就已经结束了。
代码:
var isPalindrome = function(x) {
if(x === 0) {
return true
}
if(x<0 || x%10===0){
return false
}
let arr = x.toString().split('');
let i = 0;
let len = arr.length
while(i<(len/2)) {
if(arr[i] != arr[len-1-i] ){
return false
}
i++;
}
return true
};
- 双指针和此算法几乎效率一致
方案比较
方案一使用的是数组原始方法,灵活运用。 方案二使用的是循环比较,也排除掉了特殊的数字,速度多次试验稍快一点。
三、总结
- 此题可以暴力颠倒法和循环判断法两种方案
- 暴力颠倒法主要是通过数组的reverse()方法调换原字符串与之比较。
- 循环判断法将每一次数组下标n的值和数组尾部倒数第n个对比(arr.length-1-n)。
文中如有错误,欢迎在评论区指正