LeetCode Palindrome Number

来源:互联网 发布:简述数据库设计步骤 编辑:程序博客网 时间:2024/05/18 16:19

问题网址:https://leetcode.com/problems/palindrome-number/description/

问题描述:
确定一个整数是否是回文。 不必考虑额外的空格。

一些提示:
负整数可能是回文? (即-1)

如果您正在考虑将整数转换为字符串,请注意使用额外空间的限制。

你也可以尝试颠倒一个整数。 但是,如果您已经解决了“反向整数”问题,则知道反转整数可能会溢出。 你将如何处理这种情况?

有一个更通用的方法来解决这个问题。

下面讨论一种方法
方法1恢复一半数字[接受]

直觉

首先想到的想法是将数字转换为字符串,并检查字符串是否是回文,但这需要额外的非常量空间来创建字符串,这是问题描述所不允许的。

第二个想法是将数字本身还原,然后将数字与原始数字进行比较,如果它们相同,则数字是回文。但是,如果反转的数字大于\ text {int.MAX} int.MAX,我们将遇到整数溢出问题。

根据第二个想法的想法,为了避免被还原的数字的溢出问题,如果我们只返回\ text {int}整数的一半呢?毕竟,如果数字是回文,回文的后半部分应该与前半部分相同。

例如,如果输入是1221,如果我们可以将数字“1221”的最后部分从“21”恢复为“12”,并将其与数字“12”的前一半相比较,因为12是相同的作为12,我们知道这个数字是一个回文。

让我们看看我们如何将这个想法转化为算法。

算法

首先,我们应该关心一些边缘情况。所有负数不是回文,例如:-123不是回文,因为’ - ‘不等于’3’。所以我们可以为所有负数返回false。

现在让我们考虑如何恢复数字的后半部分。对于1221号码,如果我们做1221%10,我们得到最后一位数字1,从第二位数字到最后一位数字,我们需要从1221中删除最后一位数字,我们可以将它除以10,1221 / 10 = 122.然后我们可以通过做一个10,122%10 = 2的模数再次得到最后一个数字,如果我们把最后一个数字乘以10并加上第二个数字1 * 10 + 2 = 12,我们想要的还原号码。继续这个过程会给我们更多的数字还原的数字。

现在的问题是,我们怎么知道我们已经达到了一半呢?

由于我们将数字除以10,并将倒数乘以10,当原数小于倒数时,意味着我们已经处理了一半的数字。

public class Solution {    public bool IsPalindrome(int x) {        if(x < 0 || (x % 10 == 0 && x != 0)) {            return false;        }        int revertedNumber = 0;        while(x > revertedNumber) {            revertedNumber = revertedNumber * 10 + x % 10;            x /= 10;        }        return x == revertedNumber || x == revertedNumber/10;    }}

时间复杂度:O(logn)