力扣258 - 各位相加

257 阅读1分钟

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。

示例:

输入: 38
输出: 2 
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。

解答:

    /**
     * 暴力解法1 : 将数字转字符数组,对每个字符强转为 int ,然后递归
     * @param num
     * @return
     */
    public int addDigits(int num) {
        char[] chars = String.valueOf(num).toCharArray();
        int sum = 0;
        for(char c : chars) {
            Integer ic = Integer.parseInt(String.valueOf(c));
            sum += ic;
        }
        if (sum > 9) {
            return addDigits(sum);
        }
        return sum;
    }

    /**
     * 暴力解法2 : 将 数字 % 10 的余数相加得到每一位的合,然后递归。
     * @param num
     * @return
     */
    public static int addDigits2(int num) {
        int sum = addNum(num);
        while (sum > 9) {
            sum = addNum(sum);
        }
        return sum;
    }

    /**
     * 求非负数每一位数字的和
     * @param num
     * @return
     */
    public static int addNum(int num) {
        int sum = 0;

        while (num / 10 > 0) {
            sum += num % 10;
            num = num / 10;
        }
        sum += num;
        return sum;
    }
    /**
     * 找规律。假设 num = 384 = 3 * 100 + 8 * 10 + 4
     * 第一轮计算   sum = 15  = 3       + 8      + 4
     *             差值       = 3 * 99  + 8 * 9     = (3 * 11 + 8) * 9 即差值为9的倍数
     * 第二轮计算   num = 15 = 1 * 10 + 5
     *             sum = 6  = 1 * 0  + 5
     *             差值 = 9
     * 由此得出规律:num % 9
     * 注意:需要注意 9 的整倍数最终结果应该返回9,小于10的数直接返回
     * 
     * @param num
     * @return
     */
    public static int addDigits3(int num) {
        if (num < 10) {
            return  num;
        }
        int res = num % 9;
        if (res == 0) {
            return 9;
        }
        return res;
    }