LeetCode--9.回文数(简单)

题目描述:

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

示例 1:

输入: 121

输出: true

示例 2:

输入: -121

输出: false

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

示例 3:

输入: 10

输出: false

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

进阶:

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

 

方法一:反转一半数字

 

 思路

  • 第一个想法是将数字转换为字符串,并检查字符串是否为回文。但是,这需要额外的非常量空间来创建问题描述中所不允许的字符串。
  • 第二个想法是将数字本身反转,然后将反转后的数字与原始数字进行比较,如果它们是相同的,那么这个数字就是回文。但是,如果反转后的数字大于 int.MAX,我们将遇到整数溢出问题。

  按照第二个想法,为了避免数字反转可能导致的溢出问题,为什么不考虑只反转int数字的一半?毕竟,如果该数字是回文,其后半部分反转后应该与原始数字的前半部分相同。

  例如,输入 1221 ,我们可以将数字“1221”的后半部分从“21”反转为“12”,并将其与前半部分“12”进行比较,因为二者相同,我们得知数字 1221 是回文。

  1. 首先,我们应该处理一些临界情况。所有负数都不可能是回文,例如:-123不是回文,因为-不等于3。所以我们可以对所有负数返回false。
  2. 现在,让我们来考虑如何反转后半部分的数字。
  3. 对于数字1221,如果执行1221%10,我们将得到最后一位数字1,要得到倒数第二位数字,我们可以先通过除以10把最后一位数字从1221中移除,1221/10=122,再求出上一步结果除以10的余数,122%10=2,就可以得到倒数第二位数字。
  4. 如果我们把最后一位数字乘以10,再加上倒数第二位数字,1*10+2=12,就得到了我们想要的反转后的数字。如果继续这个过程,我们将得到更多位数的反转数字。
  5. 现在的问题是,我们如何知道反转数字的位数已经达到原始数字位数的一半?
  6. 我们将原始数字除以10,然后给反转后的数字乘上10,所以,当原始数字小于反转后的数字时,就意味着我们已经处理了一半位数的数字。

 

关键点

  • 如果是负数,则一定不是回文数
  • 如果是正数,则将其倒序数值计算出来,然后比较和原数值是否相等
  • 如果是回文数则相等:返回true, 如果不是回文数则不相等:返回false
  • 比如123倒序为321,不相等; 121倒序为121,相等;

 

代码

class Solution {
    public boolean isPalindrome(int x) {
        //负数则一定不是回文数,直接返回 false
        if (x < 0) {
            return false;
        }
        int cur = 0;
        int num = x;
        while (num != 0) {
            //得到最后一位数字
            cur = cur * 10 + num % 10;
            //去掉num的个位数
            num /= 10;
        }
        //如果反转后的数字
        return cur == x;
    }
}

 

 

复杂度

  • 时间复杂度:O(log10(n)),对于每次迭代,我们会将输入除以10,因此时间复杂度为O(log1o(n))。
  • 空间复杂度:O(1)。
posted @ 2019-12-10 21:10  小中配奇  阅读(257)  评论(0编辑  收藏  举报