反转之后的数字和

标签: 数学 枚举

难度: Medium

给你一个 非负 整数 num 。如果存在某个 非负 整数 k 满足 k + reverse(k) = num  ,则返回 true ;否则,返回 false

reverse(k) 表示 k 反转每个数位后得到的数字。

示例 1:

输入:num = 443
输出:true
解释:172 + 271 = 443 ,所以返回 true 。

示例 2:

输入:num = 63
输出:false
解释:63 不能表示为非负整数及其反转后数字之和,返回 false 。

示例 3:

输入:num = 181
输出:true
解释:140 + 041 = 181 ,所以返回 true 。注意,反转后的数字可能包含前导零。

提示:

  • 0 <= num <= 105

Submission

运行时间: 35 ms

内存: 16.0 MB

class Solution:
    def sumOfNumberAndReverse(self, num: int) -> bool:
        if num:
            for i in range(num):
                if i+int(str(i)[::-1])==num:
                    return True
            return False
        return True

Explain

该题解通过遍历从0到num-1的所有整数,对每个整数i,计算其与其反转数之和,检查是否等于给定的num。如果找到这样的整数i,函数返回True,否则在遍历结束后返回False。对于特殊情况num为0,由于0加0等于0,直接返回True。

时间复杂度: O(num)

空间复杂度: O(1)

class Solution:
    def sumOfNumberAndReverse(self, num: int) -> bool:
        if num == 0:  # 特殊情况处理:若num为0,直接返回True
            return True
        for i in range(num):  # 遍历从0到num-1
            # int(str(i)[::-1]) 通过字符串反转计算i的反转数
            if i + int(str(i)[::-1]) == num:  # 检查i和它的反转数之和是否等于num
                return True  # 找到符合条件的i,返回True
        return False  # 遍历结束未找到符合条件的i,返回False

Explore

如果将遍历范围扩展到包括num本身,即检查num和reverse(num)的和,实际上这种情况下的和将会是num加上num的反转,这个和至少是num的两倍,除非num是0。因此,对于任何大于0的num,i + reverse(i) = num这个等式不可能成立当i等于num时。所以遍历到num-1已经足够。

使用字符串反转计算整数的反转数虽然在代码上简洁易懂,但在处理非常大的数字时可能效率不是最优,因为涉及到数字与字符串之间的多次类型转换以及字符串操作。一个更高效的方法是使用数学方法直接进行数字反转:通过循环取数字的最后一位并逐步构建反转后的数字。这种方法避免了类型转换,且在数学操作上更直接高效。

对于num为0的情况,由于0的反转仍然是0,所以0 + 0 = 0符合题目条件。这是唯一的数,其与自己的反转数相加仍然等于自己,因此对于num为0的情况进行了特殊处理。对于其他数字,由于没有类似的属性(即数字与其反转之和等于自身的情况),因此不需要进行类似的特殊处理。