LeetCode 9 回文数

207 阅读2分钟

链接:leetcode-cn.com/problems/pa…

1、题目:

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

示例1

输入: 121
输出: true

示例2

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

示例3

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

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


2、分析

题干说明是判断一个 整数 ,并且不能将整数转换成字符串来处理。

由于回文数是一个对称的数,从左读和从右读都是一样的,因此,可以将这个回文数的各个位的数字进行翻转,再比较翻转后的数字与原数字是否相同,相同则是回文数,不同则不是回文数。

2.1、排除负数

由于处理的对象是整数,所以负数不可能是回文数

2.2、如何翻转数字

要获得一个整数的各个位数,可以采用整除和取余的方法,例如:整数121

  • 取余:121 % 10 = 1,整除:121 / 10 = 12
  • 取余:12 % 10 = 2,整除: 12 / 10 = 1
  • 取余:1 % 10 = 1,整除: 1 / 10 = 0 (可作为取数的结束条件)

如上红色数字所示,所得到的1,2,1就是从右往左的各个位上的数字

2.3、将翻转后的数字按各位计算出来

此处应该要知道该数字有多少位,才能计算出来。也可以用整除的方式来。

2.4、解题步骤

到此,我们的解题思路就出来了,归纳如下:

1、排除负数
2、计算数字有多少位
3、翻转,获取各个位上的数字
4、将翻转后的数字按各位计算,与原数比较

3、代码

public class N9 {
    public static void main(String[] args) {
        int x = 12321;
        System.out.println(new N9().isPalindrome(x));
    }

    public boolean isPalindrome(int x) {
        if(x < 0){
            return false;
        }

        //此处定义两个中间变量,避免原数被改变
        int num1 = x;
        int num2 = x;

        //先算出有多少位
        int size = 1;
        while(num1 / 10 != 0){
            size *= 10;
            num1 = num1 / 10;
        }

        //再分别从右边取出每一位,得到反向输入的整数
        int reverse = 0;
        while(num2 != 0){
            int right = num2 % 10;
            reverse += right * size;
            num2 = num2 / 10;
            size = size / 10;
        }

        //最后对比是否相等
        return x == reverse;
    }
}