Leetcode-9. Palindrome Number

问题描述:

  • Determine whether an integer is a palindrome. Do this without extra space.
  • 给定一个整数, 判断该数是否是回文数
  • some hints:

Could negative integers be palindromes? (ie, -1)
If you are thinking of converting the integer to string, note the restriction of using extra space.
You could also try reversing an integer. However, if you have solved the problem “Reverse Integer”, you know that the reversed integer might overflow. How would you handle such case?
There is a more generic way of solving this problem.

问题分析

  • 根据提示可知:
    • 负数不是回文数
    • 如果采用将整数转换成字符串判定的方法,将会用到额外空间
    • 如果采用反转整数的方法,那么可能发生溢出的现象
  • 方法一: 类似于反转整数,只不过反转一半时,便可判定是否是回文整数,这便避免了溢出现象。具体做法为,从该数中一直分割出去最低位,然后用另一个数保存分割出去的数形成的数字。
    如对于12321而言,起初partOne为12321,partTwo为0,然后分割出最低位,partOne为1232, partTwo为1,继续分割,partOne为123, partTwo为12,继续分割,partOne为12, partTwo为123,此时partOne大于partTwo,停止分割,判断(partOne == partTwo) || (partOne == partTwo / 10),若为ture,便是回文数。partOne == partTwo 是针对位数为偶数的情况,partOne == partTwo / 10 是针对位数为奇数的情况
  • 方法二: 依次取出最高位与最低位进行进行比较,若不等,直接返回false,否则,对该数进行处理,去除掉最高位与最低位,变成一个新的数字,继续循环上述操作,直至中途返回false,或者该数变为0,说明是回文数。

经验教训

  • 虽然是一个十分简单的题,但是一些小细节需要注意
  • 如何依次从高位到低位依次取出一个数字的该位置上的数
    • 需要先求该数的位数bits,然后base便是10^(bits-1), 当然,求base也有其他方法。如对于121而言,100便是它的base ;num/base便是最高位上的数字,然后用num%base更新num,用base/10更新base,迭代求取下一低位上的数,直至base为0。
  • 如何依次从低位到高位依次取出一个数字的该位置上的数
    • num%10便是最低位上的数字,然后用num/10更新num,迭代求取下一高位上的数,直至num为0。
  • 如何去除一个数的最高位?
    • num % base
  • 如何去除一个数的最低位?
    • num / 10
  • 如何去除一个数的最高位与最低位?
    • (num % base) / 10
  • 如何从某个数中得到第i位数字
    • 例如1314分得到第二位数字,可以先 1314/100 = 13,让3处于最低位,然后13%10 = 3,得到该个位数
    • 也可以1314%1000 = 314,让3处于最高位,然后314/100 = 3,取出最高位
  • 时刻注意计算过程中的溢出问题

代码实现

  • 方法一:
public static boolean isPalindrome(int x) {
        //注意,当x不为0,并且以0结尾时,一定不是回文数,必须先判断
        if (x < 0 || (x != 0 && x % 10 == 0)) {
            return false;
        }
        int partOne = x;
        int partTwo = 0;
        while (partOne > partTwo) {
            //分割,更新两数
            partTwo = partTwo * 10 + partOne % 10;
            partOne = partOne / 10;
        }
        return (partOne == partTwo) || (partOne == partTwo / 10);
}
  • 方法二:
public static boolean isPalindrome(int x) {
        if (x < 0) {
            return false;
        }

        /* 不能按照以下方式求,因为base可能会发生溢出的现象,但要注意计算位数的方法 */
        /*
        int bits = 0;
        int temp = x;
        int base = 1;
        while (temp > 0) {
            bits++;
            base *= 10;
            temp /= 10;
        } 
        base /= 10;
        */
        //计算base另一种方法
        int base = 1;
        while (x / base > 10) {
            base *= 10;
        }
        while (x > 0) {
            //最高位与最低位比较
            if (x / base != x % 10) {
                return false;
            }
            //去除首尾
            x = (x % base) / 10;
            //因为去除首尾后少了两位,所以相应base也应该除以100
            base /= 100;
        }
        return true;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值