LeetCode—各位相加(循環法+模九法)

各位相加(簡單)

2020年6月9日

題目來源:力扣

在這裏插入圖片描述

解題

  • 循環法

最常見的做法,但題目要求不用循環或遞歸做

class Solution {
    public int addDigits(int num) {
        while(num>=10){
            num=num/10+num%10;
        }
        return num;
    }
}

在這裏插入圖片描述

  • 模九法

非常巧妙的數學,感覺許多題解寫的並不好,按照自己的理解寫一下

舉個例子,num=461,那麼我們可以按十進制進行分堆
在這裏插入圖片描述
這裏我們可以數出是11個堆,那我們肯定不想這麼數啊,我們可以發現
只要把100的堆減去99,10的堆減去9,加起來就是堆數了,寫成數學公式就是下圖所示,算出括號內的就是堆數
在這裏插入圖片描述
那好,4+6+1=11,還是個大於10的數,那我們可以再進行分堆,自然就是分成兩堆了
在這裏插入圖片描述
此時發現1+1=2<10,正是我們要求的結果,那自然我們想的就會是把4X99+6X9+1X9給去掉,根據他們共同的特點,都是有9或99,我們會想到把整個數模九
在這裏插入圖片描述
這樣我們就可以得到一個小於10的數了,正是我們要求的結果,但是有一個問題,如果我們的數是459呢
在這裏插入圖片描述
你會發現不對,4+5+9=18,1+8=9,答案是9,怎麼變成0了?

那這裏我們要對模9進行優化了,我們想讓最後的9模9之後還是等於9,我們可以寫成(9-1)%9+1=9
在這裏插入圖片描述
可能有些人會有疑惑,爲什麼這樣不會對4X99和6X9也造成影響,我們可以拆成兩部分看,減一的部分只在我最後的尾數部分減,並不影響前面的模九計算
至此,我們可以推導出(num-1)%9+1就是我們要求的答案

class Solution {
    public int addDigits(int num) {
        return (num-1)%9+1;
    }
}

在這裏插入圖片描述

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