整形反转,以 Long 类型为例

输入参数 Long 类型 a,倒序输出 Long。例如:输入 a=12342 输出 24321。输入 a=-12342 输出 -24321,a 不限范围。 需考虑所有可能异常情况,不能 try 不能抛异常。异常情况返回 0。Long 类型的最大值是 9223372036854775807

Don’t say much, just go to the code.

package org.bood.leetcode;

/**
 * 反转长整型数字,不使用 try-catch 或抛出异常
 *
 * @author bood
 * @since 2022/01/11
 */
public class ReverseNumber {

    /**
     * 反转给定长整型数字的数字位
     * 如果反转后的数字溢出长整型值的范围,则返回 0
     *
     * @param num 要反转的数字
     * @return {@link Long }
     * @author bood
     * @since 2024/01/02
     */
    public static Long reverseNumber(Long num) {
        // 初始化结果为 0
        long res = 0L;

        while (num != 0) {
            // 获取数字的最后一位
            long digit = num % 10;

            // 在执行乘法和加法之前检查溢出
            if (res > Long.MAX_VALUE / 10 || (res == Long.MAX_VALUE / 10 && digit > 7)) {
                // 如果继续将会溢出
                return 0L;
            }
            if (res < Long.MIN_VALUE / 10 || (res == Long.MIN_VALUE / 10 && digit < -8)) {
                // 如果继续将会下溢
                return 0L;
            }

            // 将获取的数字位追加到反转数字中
            res = res * 10 + digit;

            // 从数字中去掉最后一位
            num /= 10;
        }

        return res;
    }

    public static void main(String[] args) {
        System.out.println("反转 0:" + reverseNumber(0L));
        System.out.println("反转 1000:" + reverseNumber(1000L));
        System.out.println("Long.MAX_VALUE:" + Long.MAX_VALUE);
        System.out.println("反转 Long.MAX_VALUE:" + reverseNumber(Long.MAX_VALUE));
        System.out.println("Long.MIN_VALUE:" + Long.MIN_VALUE);
        System.out.println("反转 Long.MIN_VALUE:" + reverseNumber(Long.MIN_VALUE));
        System.out.println("反转 7185774586302733229L 溢出: " + reverseNumber(7185774586302733229L));
        System.out.println("反转 -8185774586302733229L 溢出: " + reverseNumber(-8185774586302733229L));
    }

}

你可能感兴趣的:(数据结构&算法,java,算法,leetcode)