题目描述:
- 给定一个非负整数num,反复将各个位上的数字相加,直到结果是一位数为止,返回
- 示例
- 输入:38
- 输出:2
- 解释:各位相加的过程是:3 + 8 = 11, 1 +1 =2。由于2是一位数,所以返回2
- 要求
- 不使用循环或者递归,并且在O(1)时间复杂度内解决这个问题
- 解析
- 假设有一个三位数(其实几位数都行)
- n1 = 100 * a + 10 * b + c ====> 变化之后 n2 = a + b + c =====> n1 - n2 = 99a + 9b 由此可以得到二者每次的变化就是将其缩小9的倍数
- 相当于是n1只要各个位上的数字相加,就是缩小9的倍数,直到最后得到的是一个个位数,这样我们如果不用循环,不停的除以9,那么我们就可以使用取余操作,取到最后的结果
- 代码示例
package com.xiyou.solutio;
/**
* 给定一个非负整数num, 反复将各个位上的数字相加,直到结果为一位数
* 示例:
* 输入:38 输出:2
* 解释:各位相加的过程为:3+8 = 11, 1+1=2
* 要求:不使用循环或者递归将其解决,且在O(1)时间复杂度内解决这个问题
* 思路:
* - 假设有一个三位(任意位数都行)
* n1 = 100 * a + 10 * b + c ====> 变化之后 n2 = a + b + c =====> n1 - n2 = 99a + 9b 由此可以得到二者每次的变化就是将其缩小9的倍数
* 那么我们不停的对原来的数n1对9取余,就可以得到最后的余数就应该是相加的结果
* 相当于是n1不停的缩小(9的倍数,所以不停的处以9,最后直到结果是一个个位数为止,就可以转换成对9取余)
*/
public class Solution {
public static void main(String[] args) {
int result = addDigits(123);
System.out.println(result);
}
/**
* 计算传进来的num的最终的个位数
* @param num
* @return
*/
public static int addDigits(int num) {
// 默认返回9 因为9 % 9 = 0
int result = 9;
// 如果当前传进来的参数 % 9 不为0,则直接返回取余的值
if (num % 9 != 0) {
result = num % 9;
}
// 如果当前的参数是0 0 % 0 也是 0 比较特殊 也应该特殊处理
if (num == 0) {
result = 0;
}
return result;
}
}