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 是输入数字的值。推荐使用数学规律解法,效率更高且代码简洁。
相关题目
. Reverse Integer (Medium)
. Reverse Bits (Easy)