算法 回文数

1.题目

给你一个整数 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

进阶:你能不将整数转为字符串来解决这个问题吗?

2.方法

先分析下,负数,0和10的倍数不会是回文数,所以先把这种情况单独拿出来

2.1整数反转法

思路:每次将原来的数%10得到的就是最末尾的那个数(可以生成之后反转的数),再将原来的数/10再取小数位的前面部分,一知道小数点的前面部分为0,就得到反转的整数,再和原来的数比较,如果相等,就是回文数,反之则不是回文数。

var isPalindrome = function(x) {
    if(x < 0 || (!(x % 10) && x)) return false;
    let x2 = x, res = 0;
    while(x2){
        res = res * 10 + x2 % 10;
        x2 = ~~(x2 / 10);
    }
    return res === x;
};

eg(以1234为例): x res x2
初始值 1234 0 1234
第一次循环 1234 4 123
第二次 1234 43 12
第三次 1234 432 1
第四次 1234 4321 0
跳出循环 1234 4321 0
1234 不等于4321,所以1234不是回文数

2.2整数反转法(反转一半)

后面看的官网进阶,必须要反转全部的位数吗?其实反转一半的位数也是可以的。例如,1221,反转两次得到的21和前面的12相等,是回文数;12321,反转一半得到的123和前面的123是相等的,所以是回文数。
但是怎么算是走到一半了呢,像第一个算法,只要res大于(整数个数为奇数)等于(整数个数为偶数)x2,就是反转到了一半

    var isPalindrome = function(x) {
    if(x < 0 || (!(x % 10) && x)) return false;
    let x2 = x, res = 0;
    while(res < x2){
        res = res * 10 + x2 % 10;
        x2 = ~~(x2 / 10);
    }
    return res === x2 || x2 === ~~(res/10);
};

~~的意思是相当于Math.trunc()方法会将数字的小数部分去掉,只保留整数部分。

eg(以1234为例): x res x2
初始值 1234 0 1234
第一次循环 1234 4 123
第二次 1234 43 12
跳出循环 1234 43 12
12不等于43也不等于4,所以1234不是回文数

eg(以12321为例): x res x2
初始值 12321 0 12321
第一次循环 12321 1 1232
第二次 12321 12 123
跳出循环 12321 123 12
12不等于123但是等于12(~~(123/10)),所以12321是回文数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值