Medium
题目描述
给你一个非负整数 num,如果 num 可以表示为任何非负整数及其反转的和,则返回 true,否则返回 false。
示例 1:
输入:num = 443
输出:true
解释:172 + 271 = 443,所以我们返回 true。
示例 2:
输入:num = 63
输出:false
解释:63 不能表示为任何非负整数及其反转的和,所以我们返回 false。
示例 3:
输入:num = 181
输出:true
解释:140 + 041 = 181,所以我们返回 true。注意,当一个数字被反转时,可能会有前导零。
约束条件:
0 <= num <= 10^5
提示:
- 约束条件足够小,我们可以检查每个数字。
- 要反转一个数字,首先将其转换为字符串。然后,创建一个新字符串,它是第一个字符串的反转。最后,将新字符串转换回数字。
解题思路
这是一道枚举题,关键思路是遍历所有可能的数字,检查该数字与其反转数字的和是否等于目标值。
解题思路:
暴力枚举法:由于约束条件较小(num <= 10^5),我们可以遍历从 0 到 num 的所有数字 i,检查 i + reverse(i) 是否等于 num。
数字反转:实现一个反转数字的函数。可以通过字符串反转或数学方法实现。字符串方法更直观,数学方法更高效。
优化范围:理论上只需要遍历到 num,因为如果 i > num,那么 i + reverse(i) 必然大于 num。
特殊情况:当 num = 0 时,0 + reverse(0) = 0,所以返回 true。
算法步骤:
- 遍历 i 从 0 到 num
- 计算 i 的反转数字 reversed_i
- 如果 i + reversed_i == num,返回 true
- 遍历结束后返回 false
推荐使用字符串反转方法,代码更清晰易懂。
代码实现
class Solution {
public:
bool sumOfNumberAndReverse(int num) {
for (int i = 0; i <= num; i++) {
if (i + reverse(i) == num) {
return true;
}
}
return false;
}
private:
int reverse(int n) {
string s = to_string(n);
std::reverse(s.begin(), s.end());
return stoi(s);
}
};
class Solution:
def sumOfNumberAndReverse(self, num: int) -> bool:
def reverse(n):
return int(str(n)[::-1])
for i in range(num + 1):
if i + reverse(i) == num:
return True
return False
public class Solution {
public bool SumOfNumberAndReverse(int num) {
for (int i = 0; i <= num; i++) {
if (i + Reverse(i) == num) {
return true;
}
}
return false;
}
private int Reverse(int n) {
string s = n.ToString();
char[] chars = s.ToCharArray();
Array.Reverse(chars);
return int.Parse(new string(chars));
}
}
var sumOfNumberAndReverse = function(num) {
const reverse = (n) => {
return parseInt(n.toString().split('').reverse().join(''));
};
for (let i = 0; i <= num; i++) {
if (i + reverse(i) === num) {
return true;
}
}
return false;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n × log n) | 需要遍历 0 到 n 的所有数字,每次反转数字需要 O(log n) 时间 |
| 空间复杂度 | O(log n) | 字符串反转需要额外空间存储数字的字符串表示 |
相关题目
- . Sum of Numbers With Units Digit K (Medium)