回文数
题目
给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。
回文数是指正序(从左到右)和倒序(从右到左)读都是一样的整数。
例如,121是回文,而123不是。
解答
我的分析
一句话总结题目
x是否是回文整数
自己的解法思路
1,将整数转化为字符串
2,依次对比字符串当前的首位和末位,若存在不相等则不是回文整数
我的答案
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
let xString = x.toString(); //1
for(let i = 0;i < xString.length;i++){
let index = xString.length-1-i;
if(xString[i] != xString[index]){
return false; //2
}
}
return true;
};
标准答案
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x){
if(x<0 || (x%10==0 && x!=0)) return false;
let temp=0,s=x;
while(s){
temp = temp*10+s%10;
s=Math.floor(s/10);
}
return temp === x;
}
答案分析
1,先分析回文数的特点
- 特殊情况:0、负数、10的倍数都不是回文数;
- 共性:反转后的整数=原值;
2,想办法反转数字
1)获得每次s的末位值:s%10;
2)将上一次的末位值x10+这次的末位置:temp*10+s%10;
3)s获得叠加除以末位的值:Math.floor(s/10);
tips:
- temp:获取到的反转后的数字;
- s:一个“跳板”,每次获得原值除去末位数的值;
结论
自我总结
Math.floor?
取不大于自变量(小于或等于)的最大整数。
引申思考
1,有没有可能在反转数字的位数已经达到原始数字位数的一半时,即可判断它是否为回文数?比如1221,判断12=21时(倒转后),就停止判断。
当整个过程中,不断将原始数字除以10,翻转数字不停乘以10,当翻转数字大于或等于原始数字时,代表着已经处理了一半位数的数字了。(需要判断位数是奇数or偶数)
奇数:x == revertrdNumber/10
| x(原始数字) | revertrdNumber(翻转数字) |
|---|---|
| 121 | 0 |
| 12 | 1 |
| 1 | 12 |
偶数:x == revertrdNumber
| x(原始数字) | revertrdNumber(翻转数字) |
|---|---|
| 1221 | 0 |
| 122 | 1 |
| 12 | 12 |
2,转换成字符串检验,还有更简单方法吗?
//翻转字符串
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x){
return x.toString() == x.toString().splict('').reverse().join('');
}
题目来源:力扣(LeetCode)