Java面试

 Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.

For example:

Given num = 38, the process is like: 3 + 8 = 111 + 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;

原文地址:https://www.cnblogs.com/hujingwei/p/4737353.html