题目:
给你一个 非负 整数 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 <= 10^5
java代码:
class Solution {
public boolean sumOfNumberAndReverse(final int num) {
int tmp = num, highDigit = 1; // 确定最高位位置
for (; tmp >= 20; tmp /= 10) highDigit *= 10; // 10 < tmp < 20 有两种可能
return test(num, highDigit) || tmp > 10 && test(num, highDigit * 10);
}
boolean test(final int n, int highDigit) {
if (highDigit == 1) return n < 20 && n % 2 == 0; // 两个相同的 单位数 数相加,结果为20以内的偶数
if (highDigit == 10) return n % 11 == 0; // 两个不同的 双位数 相加, 结果为200以内 11的倍数
int h = n / highDigit;
int l = n % 10;
int m = switch (h - l) { // 举例 n --> m
case 0 -> n % highDigit / 10; // 8123458 --> 12345
case 1 -> (n % highDigit + highDigit) / 10; // 5999994 --> 199999
case 10 -> n % highDigit / 10 - 1; // 1600006 --> -1 (0000 - 1)
case 11 -> (n % highDigit + highDigit) / 10 - 1; // 1966668 --> 16665
default -> -1;
};
if (m < 0 || h == 19 && l == 9) return false; // 两个 单位数 相加不可能为19
return test(m, highDigit / 100);
}
}