概述
问题描述
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
示例
输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
思路
通过模10求个位,然后各位相加即可。循环着来。(方法一)
通过对模进行观察,我们发现,所谓的模,比如说x%y,就是说x中包含有多少个y之后,还包含点啥东西。
12%10,我们会得到2,为啥?因为10被模去了。12,1代表的是10,2代表的是2. 我们如果想显示出来这个1怎么办?只能模9. 因为1的权重是10.
同理,我们可以发现,12%9 == 3, 100%9 == 1. 所以我们只需要对每个数模9,就得到了各位相加的和。so,那真的是9怎么办? 9%9等于0,所以9各位相加的和是0? 好问题。如果是这种情况,各位相加的和一定是9.因为只有9%9才等于0.(方法二)
抄了一位美女博主的解释:
时间复杂度为O(1)的解法:
方法一
Java版
class Solution {
public int addDigits(int num) {
while(num >= 10){
int tmp = 0;
while(num > 0){
tmp += num%10;
num/=10;
}
num = tmp;
}
return num;
}
}
方法二
class Solution {
public int addDigits(int num) {
if(num!=0 && num%9==0) return 9;
return num%9;
}
}
最后
以上就是义气白羊为你收集整理的258:各位相加方法一方法二的全部内容,希望文章能够帮你解决258:各位相加方法一方法二所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复