算法学习自记录/回文数

178 阅读2分钟

回文数


题目

给你一个整数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(翻转数字)
1210
121
112

偶数:x == revertrdNumber

x(原始数字)revertrdNumber(翻转数字)
12210
1221
1212

2,转换成字符串检验,还有更简单方法吗?

//翻转字符串
/**
 * @param {number} x
 * @return {boolean}
 */
 var isPalindrome = function(x){
     return x.toString() == x.toString().splict('').reverse().join('');
 }

题目来源:力扣(LeetCode)

链接来源:leetcode.cn/problems/pa…