leetCode 258 AddDigits

leetcode 258 Add Digits

题目翻译:

  给出一个非负整数num,不断地把它所有数字相加,直到最后剩下一个数字。

  例如:num=38,计算过程如,3+8=11,1+1=2,所以2就是最后的数字,返回它就可以了。

  并且,你能不使用任何循环或者递归,在O(1)的复杂度内完成吗?  

解题思路:

  时间复杂度规定了在O(1)内完成,不能采用循环或者递归,那么就变成了数学的问题了,必须找到一个类似方程式的函数,带入即可求解。然后,偶然发现对于9的倍数的一个规律:18,27,36,...,81等数字相加都是9,而且扩展到三四位数,如549,最后也得到9。这个规律的证明之后送上,这里我们可以利用这个规律,num若为9的倍数,则可以判定结果为9。对于9n+1,...,9n+8的情况,我们可以这样考虑,原始num(1)为9的倍数,其中(1)表示第一次数字相加前的num,其各位数字为Xn,Xn-1,X2,x1,则对于num(1)+1来说,若0<=x1<=8,X1=X1+1,其余不变,则num(2)=num(2)+1,如此类推,num(end)=num(end)+1,则为1;若x1=9,则x1=0,x2=x2+1,若0<=x2<=8,num(2)=num(2)-9+1=num(2)-8,相当于num(2)+1,如此类推。可以得到,num%9的结果就是最后的结果。

代码:

 1 class Solution {
 2 public:
 3     int addDigits(int num) {
 4         if (num == 0){
 5             return 0;
 6         }
 7         else if(num%9 == 0){
 8             return 9;
 9         }
10         else{
11             return num%9;
12         }
13     }
14 };

其中,若num==0时,应该返回0;num%9==0时,返回9,其他返回num%9。

时间: 2024-10-11 22:14:32

leetCode 258 AddDigits的相关文章

LeetCode —— 258

和学长聊天的时候,知道了世界上还有一个叫LeetCode的OJ平台,听说相当不错,我暂时弃了九度OJ,开刷LeetCode. LeetCode最吸引我的地方在于,每一道题都有对应的Discuss,在讨论板块里,有世界各地的优秀程序员发布的解法,可以在里面看到很多优秀的代码,优秀的思想,受益匪浅. 今天分享的题目是题号258 Add Digits 题目的意思很简单,输入一个int型数字num,将num的每个位加起来,重复这个过程,直到结果只有个位数为止,即结果为0-9. 我的第一反应是,写一个循环

Leetcode -- 258 数位相加

258. Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. For example: Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit, return it. Follow up:Could you do it withou

[leetcode] 258. Add Digits

Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. For example: Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit, return it. Follow up:Could you do it without any

LeetCode 258

Add Digits Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. For example: Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit, return it. Follow up:Could you do it

Java [Leetcode 258]Add Digits

题目描述: Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. For example: Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit, return it. 解题思路: 假设输入的数字是一个5位数字num,则num的各位

leetcode 258. Add Digits(数论)

Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. For example: Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit, return it. 这道题是求一个数的数根. 数根有一个同余性质:一个数与它的数根对(b-1)

leetcode 258 Add Digits数论

1 class Solution { 2 public: 3 int addDigits(int num) { 4 if(num == 0 ) return num; 5 else return num % 9 == 0 ? 9 : num % 9; 6 } 7 }; 就是数位根!

(easy)LeetCode 258.Add Digits

Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. For example: Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit, return it. Follow up:Could you do it without any

leetcode 258. 各位相加 (python)

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 38输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2. 由于 2 是一位数,所以返回 2. class Solution: def addDigits(self, num: int) -> int: def hanshu(nums): sum = 0 while(nums>0): ge = nums % 10 sum += ge nums = int(nums / 10) r