leetcode 剑指 offer

回文数

2020-10-06  本文已影响0人  历十九喵喵喵

我真的太喜欢定点调试了,如果看不懂别人循环代码的小伙伴,一定要试试定点调试。

好记性不如烂笔头

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:

输入: 121

输出: true

示例 2:

输入: -121

输出: false

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

示例 3:

输入: 10

输出: false

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

进阶:

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

两种解法:

第一种,和整数反转是一样的,但是有两个问题需要注意,一个是条件的判断,还有一个是  因为结果需要和 原来的 X 比较,但是在循环里面, x 的值会发生变化,所以要记得新建一个变量来保存 x 的值,这样比较的结果才不会有错。

来贴一下我写在 力扣上的代码。

class Solution {

    public boolean isPalindrome(int x) {

        int newx = x;

        if(x<0 || (x%10==0 && x!=0)){

            return false;

        }

        int revertedNumber= 0;

        while(x!=0){

            revertedNumber = revertedNumber*10+x%10;

            x/=10;

        }

        return newx==revertedNumber ;

    }

}

测试是通过了的。

第二种解法是官方解法,考虑到 会有溢出的问题,所以 只用判断一半的回文数就可以了。

在循环中, x 是随着变换减少的,如果是奇数个就 拿  x  和 反转了一半的整数 /10 相比较,如果是偶数个就拿 x 和反转了一半的整数相比较。这样也不会占用新的空间来保存 原来的 x ,空间效率就提高了。

在循环之前都需要判断的先决条件:

负数不是回文数,

末尾是 0 的数也不是回文数,因为最高位不能是 0.

所以条件是 小于 0 的数和 x%10 取尾数为 0 且 x > 0 的数不是回文数。

循环的终止条件是 x < revertedNumber , 也就是说循环的条件是 x 要小于 revertedNumber, 当 x 还是大于 反转的数十,x 还没反转一半,所以要继续反转。

class Solution {

    public boolean isPalindrome(int x) {

        // 特殊情况:

        // 如上所述,当 x < 0 时,x 不是回文数。

        // 同样地,如果数字的最后一位是 0,为了使该数字为回文,

        // 则其第一位数字也应该是 0

        // 只有 0 满足这一属性

        if (x < 0 || (x % 10 == 0 && x != 0)) {

            return false;

        }

        int revertedNumber = 0;

        while (x > revertedNumber) {

            revertedNumber = revertedNumber * 10 + x % 10;

            x /= 10;

        }

        // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。

        // 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,

        // 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。

        return x == revertedNumber || x == revertedNumber / 10;

    }

}

链接:官解回文数

上一篇 下一篇

猜你喜欢

热点阅读