LeetCode回文数 | 算法练习系列

279 阅读1分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

前言

回文数是一个神奇的存在,它体现了一种对称美,在大自然中到处都是对称的例子,猎豹的四肢,狮子的面部,漂亮的蝴蝶翅膀,等等,从古之前,我们的建筑也大多是对称的,像天安门,甚至整个故宫都对称建造的,下面就来看看怎么判断回文数吧。

题目描述

给你一个整数x,如果x是一个回文整数,返回true ;否则,返回false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121是回文,而123不是。

 

示例 1:

输入:x = 121

输出:true

示例 2:

输入:x = -121

输出:false

解释:从左向右读, 为-121 。 从右向左读, 为121- 。因此它不是一个回文数。 示例 3:

输入:x = 10

输出:false

解释:从右向左读, 为01 。因此它不是一个回文数。

示例 4:

输入:x = -101

输出:false  

提示:

-231 <= x <= 231 - 1

解题思路1

  • 看了题目我们可以很容易的排除一种情况,也就是输入为负数的时候,直接return false 即可
  • 这题的思路是我们通过取余操作和取商操作把输入数字进行反转,然后把得到结果和输入结果进行比较即可得到结果。代码如下
var isPalindrome = function(x) {
    if(x < 0)
        return false;
    var cur = 0;
    var num = x;
    while(num != 0) {
        cur = cur * 10 + num % 10; 
        num= parseInt(num/10)
    }
    return cur === x;
}

LeetCode运行结果如下

数字解法.PNG

解题思路2

  • 我们可以换种思路来解题,我们可以把输入的数当作字符串来进行处理,首先计算出转换的来的字符串的长度/2取证,然后通过取余是否等于0来进行不同的操作
  • 如果区域等于0说明字符串的个数是双数,那么right=left+1,否则right=left+2
  • 然后比较x[left]===x[right]是真假,如果是假直接return false结束,否则 left--,right++,循环结束return true,代码如下
/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
    x=String(x)
    var left =parseInt(x.length/2)-1
    var right
    if(x.length%2===0){
        right=left+1
    }
    else{
        right=left+2
    }
    while(left>=0&&right<=x.length-1){
        if(x[left]===x[right]){
            left--
            right++
        }else{
            return false
        }
    }
    return true
};

LeetCode运行结果如下:

字符串解法.PNG

总结

无论用那种方法都能解决问题,但是解决问题的思路不同,所消耗的时间和内存也不同,通过上面的图可以明显看出来。

欢迎大家分享更好的解法哦