题目概述

  • 题目:第九题
  • 难易:简单
  • 内容:

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

    示例 1:

    输入: 121输出: true

    示例 2:

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

    示例 3:

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

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/palindrome-number

第一次思路

将数字分为四组:小于0;0-9;大于9;溢出部分。

  1. 如果小于0,一定不是回文数,比如:-121 从右向左为121-,不是同一个数字
  2. 如果0-9,回文数一定是它本身,所以返回true;
  3. 溢出部分返回false
  4. 如果大于9,则需要进行判断。根据第七题整数反转,求出反转后的整数,然后二者进行比较

Code

class Solution {
public:
    bool isPalindrome(int x) {
        long y=0,t;
        t=x;
        if(x<0){
           return false;

        }
        else if(x>=0&&x<10){
             x=2;
        }
        else {while(x){
            y=y*10;
                 if(y<=INT_MIN||y>=INT_MAX)
                return false;
                y=y+x%10;
                x=x/10;
        };
            if(y==t){
                x=2;
            }else
             return false;
        }

    return x==2 ;
    }
};

测试 Submit

分析、 改进

如果对整数进行全部反转,需要考虑溢出问题,而且做了不必要的工作。只需要翻转一部分即可完成对比。
当数字长度为奇数时,我们可以通过y / 10,去除处于中间位置的数字。

比如:当输x=23432时,反转后的y=234,此时y/10,得到23,比较y和修改后的x是否相等,相等即为回文数

改进Code

class Solution {
    public bool IsPalindrome(int x) {

        if(x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }

        int y = 0;
        while(x > y) {
            y = y * 10 + x % 10;
            x /= 10;
        }


        return x == y || x == y/10;
    }
};


改进Submit

执行时间:12ms;
内存消耗:8.1MB

收获总结

考虑问题不只有一种方法,要多方面考虑,要简化问题。

01-12 00:42