首页 > 其他 > 详细

leetCode 258 AddDigits

时间:2016-01-10 21:17:46      阅读:286      评论:0      收藏:0      [点我收藏+]

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。

leetCode 258 AddDigits

原文:http://www.cnblogs.com/lfwllq/p/5118234.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!