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