力扣 第258题 各位相加

题目

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

示例:

输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-digits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

暴力版答案

循环求得各个位数的和
当求的和大于10,那么,重新计算各个位数的和,直到和小于10为止
    //暴力版
    //循环求得各个位数的和
    //当求的和大于10,那么,重新计算各个位数的和,直到和小于10为止
    public static int addDigits(int num) {
        //如果num小于10,返回num
        if (num < 10) {
            return num;
        }
        int sum = 0;
        for (; num >= 10; ) {
            //将num的个位数赋值给i
            int i = num % 10;
            //num除以10的值 赋值给num
            num = num / 10;
            //累计求个位数的和
            sum += i;
            if (num < 10) {
                //如果num小于10,则sum加上num,(与最高位数相加的和)
                sum += num;
                if (sum >= 10) {
                    //如果sum大于10,则赋值为num,且sum赋值为0
                    num = sum;
                    sum = 0;
                }
            }
        }
        return sum;
    }

进阶版答案

进阶版,不用循环和递归
原理:最后结果只有一位数,那么必然返回的是1~9
所以,num如果能够被9整除,那么返回结果就为9
如果不能被9整除,返回结果就是num%9的余数
    //进阶版,不用循环和递归
    //原理:最后结果只有一位数,那么必然返回的是1~9
    //所以,num如果能够被9整除,那么返回结果就为9
    //如果不能被9整除,返回结果就是num%9的余数
    public static int addDigits2(int num) {
        //如果num小于10,返回num
        if (num < 10) {
            return num;
        }
        int sum = num % 9;
        if (sum == 0) {
            return 9;
        }
        return sum;
    }

测试代码结果正确并可提交

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章