力扣 第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;
    }

測試代碼結果正確並可提交

在這裏插入圖片描述

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