题目:

给你一个 非负 整数 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);
    }
}