google的一道JAVA面试题!!!

java代码:  
  1. Consider a function which, for a given whole number n, returns the number of ones required when writing out all numbers between 0 and n. 
  2. For example, f(13)=6. Notice that f(1)=1. What is the next largest n such that f(n)=n? 


翻译过来大体是这样: 
有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。比如f(13)=6,现在f(1)=1,问下一个最大的f(n)=n的n是什么?

答案一:

  1. int getCountOfNumber(int number){ 
  2.                 int count=0; 
  3.                 int length=("" + number).length(); 
  4.                 
  5.                 for(int i=0;i<=length;i++){ 
  6.                         int num=number%10; 
  7.                         number=(number-num)/10; 
  8.                         
  9.                         if(num*num==1) count++; 
  10.                 } 
  11.                 
  12.                 return count; 
  13.         }


计算到:199981 用了203
不过只计算到上边的数值就没多大意思,看看这个:
这个是4000000000以内的结果!:
f(0) = 0 
f(1) = 1 
f(199981) = 199981 
f(199982) = 199982 
f(199983) = 199983 
f(199984) = 199984 
f(199985) = 199985 
f(199986) = 199986 
f(199987) = 199987 
f(199988) = 199988 
f(199989) = 199989 
f(199990) = 199990 
f(200000) = 200000 
f(200001) = 200001 
f(1599981) = 1599981 
f(1599982) = 1599982 
f(1599983) = 1599983 
f(1599984) = 1599984 
f(1599985) = 1599985 
f(1599986) = 1599986 
f(1599987) = 1599987 
f(1599988) = 1599988 
f(1599989) = 1599989 
f(1599990) = 1599990 
f(2600000) = 2600000 
f(2600001) = 2600001 
f(13199998) = 13199998 
f(35000000) = 35000000 
f(35000001) = 35000001 
f(35199981) = 35199981 
f(35199982) = 35199982 
f(35199983) = 35199983 
f(35199984) = 35199984 
f(35199985) = 35199985 
f(35199986) = 35199986 
f(35199987) = 35199987 
f(35199988) = 35199988 
f(35199989) = 35199989 
f(35199990) = 35199990 
f(35200000) = 35200000 
f(35200001) = 35200001 
f(117463825) = 117463825 
f(500000000) = 500000000 
f(500000001) = 500000001 
f(500199981) = 500199981 
f(500199982) = 500199982 
f(500199983) = 500199983 
f(500199984) = 500199984 
f(500199985) = 500199985 
f(500199986) = 500199986 
f(500199987) = 500199987 
f(500199988) = 500199988 
f(500199989) = 500199989 
f(500199990) = 500199990 
f(500200000) = 500200000 
f(500200001) = 500200001 
f(501599981) = 501599981 
f(501599982) = 501599982 
f(501599983) = 501599983 
f(501599984) = 501599984 
f(501599985) = 501599985 
f(501599986) = 501599986 
f(501599987) = 501599987 
f(501599988) = 501599988 
f(501599989) = 501599989 
f(501599990) = 501599990 
f(502600000) = 502600000 
f(502600001) = 502600001 
f(513199998) = 513199998 
f(535000000) = 535000000 
f(535000001) = 535000001 
f(535199981) = 535199981 
f(535199982) = 535199982 
f(535199983) = 535199983 
f(535199984) = 535199984 
f(535199985) = 535199985 
f(535199986) = 535199986 
f(535199987) = 535199987 
f(535199988) = 535199988 
f(535199989) = 535199989 
f(535199990) = 535199990 
f(535200000) = 535200000 
f(535200001) = 535200001 
f(1111111110) = 1111111110 

有人用c写了一个,得出这些结果只用了几十毫秒!
有更好思路的MAIL IT TO ME。 thanks~:) safecn@gmail.com

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值