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 <= 10^6

提示:

  • 除了数字 0 本身,任何以 0 结尾的数字在反转时都会永久丢失一些数字。

解题思路

解题思路

这道题的核心在于理解数字反转的特性。我们需要找出什么情况下一个数字经过两次反转后能够保持不变。

方法一:直接模拟(暴力解法)

最直观的方法是按照题意直接进行两次反转操作,然后判断结果是否与原数字相等。

方法二:数学规律观察(推荐解法)

通过观察可以发现一个重要规律:

  • num = 0 时,反转后仍为 0,所以双重反转后等于原数
  • num 的末位不为 0 时,反转过程中不会丢失数字,所以双重反转后等于原数
  • num 的末位为 0 且 num ≠ 0 时,第一次反转会去掉末尾的 0,导致数字位数减少,双重反转后无法恢复原数

因此,判断条件可以简化为:num == 0 || num % 10 != 0

这个规律的原理是:反转操作会去掉前导零,所以如果原数字末位有零(除了 0 本身),经过反转后这些零会消失,再次反转无法恢复。

例如:1800 → 81 → 18,最终的 18 不等于原来的 1800。

复杂度对比

  • 直接模拟:时间复杂度 O(log n),需要实际执行反转操作
  • 数学规律:时间复杂度 O(1),只需要一次模运算

显然数学规律方法更优,代码也更简洁。

代码实现

class Solution {
public:
    bool isSameAfterReversals(int num) {
        return num == 0 || num % 10 != 0;
    }
};
class Solution:
    def isSameAfterReversals(self, num: int) -> bool:
        return num == 0 or num % 10 != 0
public class Solution {
    public bool IsSameAfterReversals(int num) {
        return num == 0 || num % 10 != 0;
    }
}
/**
 * @param {number} num
 * @return {boolean}
 */
var isSameAfterReversals = function(num) {
    if (num === 0) return true;
    return num % 10 !== 0;
};

复杂度分析

复杂度类型数学规律解法直接模拟解法
时间复杂度O(1)O(log n)
空间复杂度O(1)O(1)

其中 n 是输入数字的值。推荐使用数学规律解法,效率更高且代码简洁。

相关题目