【算法题】2443. 反转之后的数字和

该问题是一个编程挑战,要求编写一个Java函数来检查给定的非负整数num是否可以表示为两个非负整数k和其反转k的和。函数通过遍历和递归策略来寻找可能的解,考虑了不同位数的情况和反转数字的特性,例如,当反转数字有前导零时。
摘要由CSDN通过智能技术生成

题目:

给你一个 非负 整数 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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值