Java面试
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.
要求:不能用递归,不能用循环,并且在O(1)时间复杂度内求解
比较原始的解法如下:
/**
* Created by seven_hu on 2015/8/16.
*/
public class demo1 {
public static void main(String[] args){
System.out.println(getLastResult2(248));
}
//getResult(int num)的作用是将num拆分,得到各个数位上的值,然后对他们进行求和,返回最后的和
public static int getMediaResult(int num){
int sum=0;
while (num!=0){
sum=num%10+sum;
num=num/10;
}
return sum;
}
//
public static int getLastResult(int num){
int result=getMediaResult(num);
while(result>9){
result=getMediaResult(result);
}
return result;
}
}
虽然上述代码解决了问题,但是不符合要求。因此正确的解法如下:
public static int getLastResult2(int num){
return (num-1)%9+1;
}
解释如下:
对于任意一个整数,它要么是9的倍数,要么不是9的倍数。
如果一个数(记为num)是9的倍数,那么它会有如下两个性质:
1.num不管是几位,它的各个位上的数字之和也是9的倍数。(记各个位上的数字之和为Snum)
2.两个相邻的9的倍数之差是9.
3.num%9=Snum%9
对于任意一个整数num(可以是9的倍数,也可以不是),假设离它最近的并且比它小的9的倍数的各个位上的数字之和为9的n倍
public static int getLastResult2(int num){
return (num-1)%9+1;
}