• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
seven_hu
博客园    首页    新随笔    联系   管理    订阅  订阅

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 = 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;
} 

posted @ 2015-08-17 18:25  seven_hu  阅读(247)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3