[路飞]leetcode-09.回文数(JS版本)

179 阅读1分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」。

题目

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

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

解题思路

一、使用JSAPI

将数字转换为字符串,切割字符串并且reverse,最后join为字符串,两两对比,查看是否符合要求,代码如下

var isPalindrome = function (x) {
  if (x < 0) return false;
  const str = x.toString();
  const list = str.split("");
  if (str === list.reverse().join("")) return true;
  return false;
};

二、使用数字取余思想

这部分分析的时候有个小技巧,我们可以先分析边界情况,像回文数这道题,边界情况为下

1、 负数不是回文数

2、两位数结尾为0不是回文数

3、0 是回文数

同时我们分析一下数据要怎么来计算

这部分思路分为奇偶数,

比如 1221(偶数),我们可以从个位开始反向创建一个新的变量,变量保存的就是倒着存起来的数据,如下示例

1221 % 10 === 1

122 % 10 === 2

倒起来的两个数据连接起来 即

12 且 12 === 12 因此此部分为回文数

如果是奇数呢,例如 121,则

121 % 10 === 1

12 % 10 === 2

1 === 12 /10 向下取整,因此代码如下

var isPalindrome = function (x) {
    if (x < 0 || (x % 10 === 0 && x > 0)) return false;
    let revertNumber = 0;
    while (x > revertNumber) {
        revertNumber = revertNumber * 10 + (x % 10);
        x = Math.floor(x / 10);
        console.log(x);
    }

    if (x === revertNumber || x === Math.floor(revertNumber / 10)) return true;
    return false;
};

性能分析

时间复杂度:O(logn),对于每次迭代,我们会将输入除以 10,因此时间复杂度为 O(logn)。

空间复杂度:O(1)O(1)。我们只需要常数空间存放若干变量。

其他方案

还有一种方案实现并不那么优化,但是可以扩展一下大家的思路,大概分析如下

同时截取首尾来进行对比,两两对比直到对比完成,返回对应对比结果即可

有兴趣的可以自己手撸一份哦~~~