反转两次的数字

标签: 数学

难度: Easy

反转 一个整数意味着倒置它的所有位。

  • 例如,反转 2021 得到 1202 。反转 12300 得到 321不保留前导零

给你一个整数 num反转 num 得到 reversed1接着反转 reversed1 得到 reversed2 。如果 reversed2 等于 num ,返回 true ;否则,返回 false

示例 1:

输入:num = 526
输出:true
解释:反转 num 得到 625 ,接着反转 625 得到 526 ,等于 num 。

示例 2:

输入:num = 1800
输出:false
解释:反转 num 得到 81 ,接着反转 81 得到 18 ,不等于 num 。 

示例 3:

输入:num = 0
输出:true
解释:反转 num 得到 0 ,接着反转 0 得到 0 ,等于 num 。

提示:

  • 0 <= num <= 106

Submission

运行时间: 22 ms

内存: 16.1 MB

class Solution:
    def isSameAfterReversals(self, num: int) -> bool:
        if num==0:return True
        if num%10==0: return False
        return True

Explain

题目要求判断一个数字反转两次后是否与原数字相同。首先,任何数字反转两次理论上应该回到原始状态。但特殊情况是,如果一个数字的末尾有0,第一次反转后会丢失这些0(不保留前导零),导致第二次反转后的数字不等于原始数字。因此,只需检查数字是否为0或其末尾是否有0。如果数字是0,它经过两次反转仍然是0;如果数字末尾有0(且数字不是0),则反转两次后数字会变,返回false。否则,返回true。

时间复杂度: O(1)

空间复杂度: O(1)

class Solution:
    def isSameAfterReversals(self, num: int) -> bool:
        # 如果数字是0,两次反转后仍是0
        if num == 0: return True
        # 如果数字末尾是0(且数字不是0),经过两次反转后将不相等
        if num % 10 == 0: return False
        # 其他情况下,数字两次反转后应该和原数字相同
        return True

Explore

在数字反转的过程中,我们通常将数字视为字符串来处理。例如,数字100反转时首先被视为字符串'100'。反转字符串得到'001',再将其转换回数字时,前导的0在数字中是不被保留的,因此变成1。这就是为什么数字末尾的0在反转后会消失,因为在数字和字符串的转换过程中,前导0总是被省略。

考虑一个没有末尾0的非零数字,比如123。首次反转后变成321,第二次反转再变回123。这是因为在没有末尾0的情况下,数字的每一位在反转过程中都被保留,并且顺序完全颠倒。当再次执行相同的反转操作时,所有数字的位都将恢复到原始顺序。这样,任何末尾没有0的非零数字通过两次反转都会恢复到其原始形态。

使用`num % 10 == 0`来判断一个数字是否以0结尾是可靠的。这是因为这种方法直接检查数字的最低位是否是0。唯一需要注意的边界情况是数字本身为0的情况,这在代码中已经单独处理,即如果`num == 0`则返回true。因此,不存在未考虑的边界情况。

反转数字的过程比较直接,只涉及到数字位的颠倒。对于整数,除了前面提到的末尾0的问题外,没有其他会影响反转结果的特殊情况。因为整数的反转涉及的操作简单(即位的颠倒),所以除了末尾0导致的前导0问题外,不存在其他特殊或异常情况,这也是为什么原解释中没有提到这些情况。