【每日算法】力扣9. 回文数

166 阅读1分钟

「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」。

描述

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

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

做题

如果使用将整数转换为字符串来解决这个问题,就非常简单了。

我们只需要一个头指针,一个尾指针,当两个指针的字符串相等,两个指针同时往中间靠近,当头指针越过尾指针后停止。

代码就不展示了。

我们直接来写不使用字符串该怎么解决这个问题。

不使用字符串,那肯定就要对一个整数进行运算了,如何获取各十百千位上的数?

我们可以是通过 %10 的操作获得,例如 1221 % 10 = 1,我们就获取了个位,1221 /10 % 10 = 2,我们就获取了百位。

从题目给出的例子中,我们可以看出,负数和 10 的倍数都不是回文数,这两个条件可以转换为如下两条判断:

  1. x < 0.
  2. x%10 == 0 && x != 0.(因为 0 是回文数)

同使用字符串的做法一样,不使用字符串也是可以只循环一半的数字就可以判断出是否是回文数。

比如 1221,我们可以把这个数彻底反转过来对比是否相等。

但实际上,我们只需要拿到后半段 21 的反转数 12,就可以跟前半段 12 比较是否相等,就可以判断它是不是一个回文数了。

如果出现奇位数的数,比如,12321 ,那我们反转 321 得到 123,然后再使用 123 / 10 和 12 相比,就可以判断它是不是一个回文数了。

于是,这里有个问题,我们如何判断该停止反转这个数呢?

假设是回文数:

(前半段的数:a,后半段反转的数:b)

偶位数时,a == b 时停止。

奇位数时,a < b 时停止,如 12321。

那循环的条件是:a > b

所以这里得出判断是否是回文数的条件:

  1. a == b
  2. a == b/10(这里是考虑到奇位数时,)

敲代码!

public boolean isPalindrome(int x) {
    if( x < 0 || x%10 == 0 && x != 0){
        return false;
    }
    //后一半的反转数
    int number = 0;
    //
    while(x > number){
        number = number * 10 + x % 10;
        x/=10;
    }
    return number == x || number / 10 == x;
}

image.png

最后

今天就到这里了。

这里是程序员徐小白,【每日算法】是我新开的一个专栏,在这里主要记录我学习算法的日常,也希望我能够坚持每日学习算法,不知道这样的文章风格您是否喜欢,不要吝啬您免费的赞,您的点赞、收藏以及评论都是我下班后坚持更文的动力。