[Leetcode]9. 回文数

x33g5p2x  于2022-07-04 转载在 其他  
字(0.9k)|赞(0)|评价(0)|浏览(299)

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.分析过程

方法:反转整数法。即取整取余按位乘十法

  1. 用目标值对10取余提取末尾数字
  2. 把目标值对10取整来去掉末尾数字
  3. 将上一个取到的末尾数字乘以10,加上新的末尾数字

依次类推,实现整数的反转,然后对比即可。

3.解题过程

方法1:反转整数法

根据分析过程中反转整数的思路,实现以下代码:

class Solution {
    public boolean isPalindrome(int x) {
        if(x<0){
            return false;
        }
        //121 545 12021
        int taget = x;
        int revert = 0;
        while(taget>0){
            revert = revert * 10 + taget%10;
            taget = taget/10;
        }
        if (revert == x){
            return true;
        }
        return false;
    }
}

方法2:反转一半整数法

进一步优化:考虑可能出现超出整数范围的可能,因此采用反转一半整数的方法进行求解:

class Solution {
    public boolean isPalindrome(int x) {
        // x为负数,或者个位数是0时 不是回文数
        if(x < 0 || (x % 10 == 0 && x != 0)){
            return false;
        }
        //121 545 12021
        //反转一半的数字
        int revert = 0;
        while(x > revert){
            revert = revert * 10 + x % 10;
            x = x / 10;
        }
        //位数为偶数适用第一个条件,位数为奇数适用第二个条件
        return revert == x || x == revert/10;
    }
}

注意:这里需要单独考虑个位数字为0的情况。

相关文章