`
simohayha
  • 浏览: 1387623 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

google的一道面试题。

阅读更多
这个题目的英文原题是:
引用

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.

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是什么?

为什么f(13)=6, 因为1,2,3,4,5,6,7,8,9,10,11,12,13.数数1的个数,正好是6.
分享到:
评论
43 楼 viperkiss 2007-04-22  
mjy304122 写道
我还没有说我的思路。。。。
我只是说上面众多讨论中我觉得f(9),f(99)..
这种思路还算快,但是我还是觉得他慢。。。
剪枝,我觉得还要看怎剪,不相信我先给结果。。。
程序以后再给。。。

结果。。后面还有1111111110 和10000000000由于溢出所以没算。。

1,0ms used!

199981,0ms used!

199982,0ms used!

199983,0ms used!

199984,0ms used!

199985,0ms used!

199986,0ms used!

199987,0ms used!

199988,0ms used!

199989,0ms used!

199990,0ms used!

200000,0ms used!

200001,0ms used!

1599981,16ms used!

1599982,16ms used!

1599983,16ms used!

1599984,16ms used!

1599985,16ms used!

1599986,16ms used!

1599987,16ms used!

1599988,16ms used!

1599989,16ms used!

1599990,16ms used!

2600000,16ms used!

2600001,16ms used!

35000000,16ms used!

35000001,16ms used!

35199981,31ms used!

35199982,47ms used!

35199983,47ms used!

35199984,47ms used!

35199985,47ms used!

35199986,47ms used!

35199987,47ms used!

35199988,47ms used!

35199989,47ms used!

35199990,47ms used!

35200000,47ms used!

35200001,47ms used!

500000000,47ms used!

500000001,47ms used!

500199981,47ms used!

500199982,47ms used!

500199983,47ms used!

500199984,47ms used!

500199985,47ms used!

500199986,47ms used!

500199987,47ms used!

500199988,62ms used!

500199989,62ms used!

500199990,62ms used!

500200000,62ms used!

500200001,62ms used!

501599981,62ms used!

501599982,62ms used!

501599983,62ms used!

501599984,62ms used!

501599985,62ms used!

501599986,62ms used!

501599987,62ms used!

501599988,62ms used!

501599989,62ms used!

501599990,62ms used!

502600000,62ms used!

502600001,62ms used!

535000000,62ms used!

535000001,62ms used!

535199981,62ms used!

535199982,62ms used!

535199983,62ms used!

535199984,62ms used!

535199985,62ms used!

535199986,62ms used!

535199987,62ms used!

535199988,62ms used!

535199989,62ms used!

535199990,62ms used!

535200000,62ms used!

535200001,62ms used!



怎么没有f(13199998) = 13199998 ?
复制粘贴的时候弄错了?还是算法问题?


我机器上没有c,用java做了个,结果如下:
1,0ms
199981,0ms
199982,0ms
199983,0ms
199984,0ms
199985,0ms
199986,0ms
199987,0ms
199988,0ms
199989,0ms
199990,0ms
200000,0ms
200001,0ms
1599981,15ms
1599982,15ms
1599983,15ms
1599984,15ms
1599985,15ms
1599986,15ms
1599987,15ms
1599988,15ms
1599989,15ms
1599990,15ms
2600000,15ms
2600001,15ms
13199998,15ms
35000000,15ms
35000001,15ms
35199981,31ms
35199982,31ms
35199983,31ms
35199984,31ms
35199985,31ms
35199986,31ms
35199987,31ms
35199988,31ms
35199989,31ms
35199990,31ms
35200000,31ms
35200001,31ms
117463825,31ms
500000000,31ms
500000001,31ms
500199981,31ms
500199982,31ms
500199983,31ms
500199984,31ms
500199985,31ms
500199986,31ms
500199987,31ms
500199988,31ms
500199989,31ms
500199990,31ms
500200000,31ms
500200001,31ms
501599981,47ms
501599982,47ms
501599983,47ms
501599984,47ms
501599985,47ms
501599986,47ms
501599987,47ms
501599988,47ms
501599989,47ms
501599990,62ms
502600000,62ms
502600001,62ms
513199998,62ms
535000000,78ms
535000001,78ms
535199981,78ms
535199982,78ms
535199983,78ms
535199984,78ms
535199985,78ms
535199986,78ms
535199987,78ms
535199988,78ms
535199989,78ms
535199990,78ms
535200000,78ms
535200001,78ms
1111111110,78ms
42 楼 mjy304122 2007-04-17  
我就不再卖关子了。。。。。。。
既然,很多人都还停留在追求所谓速度上。。。。
对于2进制
f(1)=1,f(10)=10   就再没有符合了
3进制
f(1)=1,f(11)=11,f(12)=12,f(110)=110
4进制
符合的有
1,121,122,123,130,200,201,1110
。。。。。。。
。。。。。。。
十进制最后的就是f(1111111110)=1111111110

还有以下是求f(n)的方法count(n)是直接算的。。。
对任何进制可用,2进制的话q=q*2,当然除也是除十。。。
绝对比以上的求f(n)的方法快,当然还可以再加工一下
还有最主要的如何提高遍历的速度,就是楼主说的剪枝(我人为我的方法也不能称为剪枝)
我用了很简单的思想以后再说。。。。。
当然,为什么1111111110是最大,这是函数变化率的问题,大家朝这个方向想想就明白了。

time=0;
q=1;
public int count(int n){
clear();
num=n;
tem1=n;
temp(n);
while(tem1!=0){
q=q*10;
temp(tem1);
}


//System.out.print(time);
//System.out.println();
//System.out.println();
return time;
}
private void temp(int n){
int a=n/10;
int b=n%10;
tem1=a;

time=time+a*q;
if(b>1)
time=time+q;
else if(b==1)
time=time+num%q+b;

}


41 楼 Elminster 2007-04-17  
mjy304122 写道
还有我是全算完才60ms
不是只算一个用了60ms
楼主要说算到1111111110用了0ms有过其实吧。


那个 C 程序就摆在那里,你好歹弄下来编译运行尝试一下再说好吧?
40 楼 mjy304122 2007-04-16  
还有我是全算完才60ms
不是只算一个用了60ms
楼主要说算到1111111110用了0ms有过其实吧。
39 楼 mjy304122 2007-04-16  
哦。。是吗。。
哈哈。。先说明讨论一下。。
楼主能帮助说明一下具体思路吗?
你看到有那么多的计算用了30000ms的同志可辛苦了。。。
希望楼主帮忙说明思路。。。
我想说的是:如果题目算的不是“1”是“2”或“9”
有什么不一样?用2进制答案会是多少?3进制呢?
16进制呢?
你对题目理解多少?
题目目的就更本不是要人们编程来解决问题。。。
题目就是问最大的f(n)=n是多少。。。
以上所有讨论就算算到1111111110也不是他的答案。。


还有楼主给的c程序,我没细看只是大概看了看
看到人都晕了。。
速度究竟是否真那么快不知道。。
但我觉得内存用的较多了吧?
简单的问题复杂化了。
楼主的c程序是自己写的吗?
剪枝也是多次剪吧?
我只用了一种很简单的思路,编的程序也很易懂。
道理很简单。。。速度也快。


还有我用的是java
在计算时间上会与c不一样。。
但我能说我的思路绝对快。。。

35199981,31ms used!

35199982,47ms used!



500199987,47ms used!

500199988,62ms used!

可以看出不是编程上的时间差。。
和系统有关。
我觉得真正运算时间也是接近0ms的。

38 楼 mjy304122 2007-04-16  
还有我用的是java
在计算时间上会与c不一样。。
但我能说我的思路绝对快。。。

35199981,31ms used!

35199982,47ms used!




500199987,47ms used!

500199988,62ms used!

可以看出不是编程上的时间差。。
和系统有关。
我觉得真正运算时间也是接近0ms的。
37 楼 mjy304122 2007-04-16  
还有楼主给的c程序,我没细看只是大概看了看
看到人都晕了。。
速度究竟是否真那么快不知道。。
但我觉得内存用的较多了吧?
简单的问题复杂化了。
楼主的c程序是自己写的吗?
剪枝也是多次剪吧?
我只用了一种很简单的思路,编的程序也很易懂。
道理很简单。。。速度也快。
36 楼 mjy304122 2007-04-16  
哦。。是吗。。
哈哈。。先说明讨论一下。。
楼主能帮助说明一下具体思路吗?
你看到有那么多的计算用了30000ms的同志可辛苦了。。。
希望楼主帮忙说明思路。。。
我想说的是:如果题目算的不是“1”是“2”或“9”
有什么不一样?用2进制答案会是多少?3进制呢?
16进制呢?
你对题目理解多少?
题目目的就更本不是要人们编程来解决问题。。。
题目就是问最大的f(n)=n是多少。。。
以上所有讨论就算算到1111111110也不是他的答案。。
35 楼 simohayha 2007-04-16  
to mjy304122

我给的那个 c程序,
f(1111111110) = 1111111110 花费 0ms.

34 楼 mjy304122 2007-04-16  
哦!!
很好。。
阳光的解答和我看到题目的第一思路一样。。。
但是我随后就觉得还是较慢。
就算命中区间,也还是要在区间内搜索。。
想请教阳光的用时时多少?

还有你既然想出这么好的思路为什么不再深入想想呢?
你在算f(n)=?时用的是什么方法?
只是求f(n)的方法,还有你下一步贪心怎样贪心
33 楼 阳光晒晒 2007-04-16  
我说的分治是:
f(10^m)=?
m=1 f(10)=1
m=2 f(100)=10*f(10)+K
m=3 f(1000)=10*f(100)+K

当f(10^m)>10^m>10^(m-1)>f(10^(m-1))时命 中
32 楼 mjy304122 2007-04-16  
我还没有说我的思路。。。。
我只是说上面众多讨论中我觉得f(9),f(99)..
这种思路还算快,但是我还是觉得他慢。。。
剪枝,我觉得还要看怎剪,不相信我先给结果。。。
程序以后再给。。。

结果。。后面还有1111111110 和10000000000由于溢出所以没算。。

1,0ms used!

199981,0ms used!

199982,0ms used!

199983,0ms used!

199984,0ms used!

199985,0ms used!

199986,0ms used!

199987,0ms used!

199988,0ms used!

199989,0ms used!

199990,0ms used!

200000,0ms used!

200001,0ms used!

1599981,16ms used!

1599982,16ms used!

1599983,16ms used!

1599984,16ms used!

1599985,16ms used!

1599986,16ms used!

1599987,16ms used!

1599988,16ms used!

1599989,16ms used!

1599990,16ms used!

2600000,16ms used!

2600001,16ms used!

35000000,16ms used!

35000001,16ms used!

35199981,31ms used!

35199982,47ms used!

35199983,47ms used!

35199984,47ms used!

35199985,47ms used!

35199986,47ms used!

35199987,47ms used!

35199988,47ms used!

35199989,47ms used!

35199990,47ms used!

35200000,47ms used!

35200001,47ms used!

500000000,47ms used!

500000001,47ms used!

500199981,47ms used!

500199982,47ms used!

500199983,47ms used!

500199984,47ms used!

500199985,47ms used!

500199986,47ms used!

500199987,47ms used!

500199988,62ms used!

500199989,62ms used!

500199990,62ms used!

500200000,62ms used!

500200001,62ms used!

501599981,62ms used!

501599982,62ms used!

501599983,62ms used!

501599984,62ms used!

501599985,62ms used!

501599986,62ms used!

501599987,62ms used!

501599988,62ms used!

501599989,62ms used!

501599990,62ms used!

502600000,62ms used!

502600001,62ms used!

535000000,62ms used!

535000001,62ms used!

535199981,62ms used!

535199982,62ms used!

535199983,62ms used!

535199984,62ms used!

535199985,62ms used!

535199986,62ms used!

535199987,62ms used!

535199988,62ms used!

535199989,62ms used!

535199990,62ms used!

535200000,62ms used!

535200001,62ms used!
31 楼 simohayha 2007-04-16  
你的那样会快?把证明或算法,或程序给出来,瞧瞧。

你可以运行下我给的那个程序,看看他的时间是多少.

PS;我还是觉得这个题的算法好不好,关键在剪枝.
30 楼 mjy304122 2007-04-16  
对于f(n)=?的计算。。
以上讨论的以f(9),f(99),f(999)。。。。。这种方法最快。。。
但是数值很大的话如123456789要分解好多次。。。
还是慢了一点哦。。。。
29 楼 mjy304122 2007-04-16  
我的思路分两步:
1。查找f(n)=?
2。找出f(n)=n是多少?
看起来好像很费力但是我的思想是前面都没见过的。。
我敢说我可以证明是最快的。。(除了语言上的优化外)
28 楼 mjy304122 2007-04-16  
这样吧。。。我写一个让人深思的讨论。。。
如果是2进制下。。同让的题目。。答案是多少。。。
27 楼 mjy304122 2007-04-16  
的确。。。
有兴趣研究一下吗?
加群。。。
只用60ms
26 楼 simohayha 2007-04-16  
你的全算完是什么意思?能够全算完吗?
25 楼 mjy304122 2007-04-16  
有兴趣研究算法的可加群250581
请注明研究算法。。
24 楼 mjy304122 2007-04-16  
呵呵。。
希望有人继续讨论讨论
用我的思路全算完才60ms
是全算完哦。。。
大家留意
楼上的可以写出具体过程,光说看不出效果。。。

相关推荐

    程序员面试题精选100题

    分析:这是去年google 的一道面试题。 我看到这道题目时,第一反应就是每次push 一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将 是最小元素。但由于不能保证最后push 进栈的元素最先出栈,这种思路设计的...

    程序员面试金典-第五版

    第8~9 章从数据结构、概念与算法、知识类问题和附加面试题4 个方面,为读者呈现了出自微软、苹果、谷歌等多家知名公司的150 道编程面试题,并针对每一道面试题目,分别给出了详细的解决方案。 本书适合程序开发和...

    google百度北电华为腾讯试题及面试

    中兴面试题 1>某人在某个市场某个商家买了某台电脑,请用你熟悉的计算机语言表达出里面的关系. 其中有商家类,买家类,商品类。还要有买方法,卖方法。 2>一个完整的单例模式 3>曹操南下攻打刘备,刘备派关羽守...

    程序员面试金典 第五版 带书签目录

    第8~9 章从数据结构、概念与算法、知识类问题和附加面试题4 个方面,为读者呈现了出自微软、苹果、谷歌等多家知名公司的150 道编程面试题,并针对每一道面试题目,分别给出了详细的解决方案。 本书适合程序开发和...

    程序员面试金典 第5版

    本书是原谷歌资深面试...第8~9 章从数据结构、概念与算法、知识类问题和附加面试题4 个方面,为读者呈现了出自微软、苹果、谷歌等多家知名公司的150 道编程面试题,并针对每一道面试题目,分别给出了详细的解决方案。

    程序员面试金典-5版

    第8~9 章从数据结构、概念与算法、知识类问题和附加面试题4 个方面,为读者呈现了出自微软、苹果、谷歌等多家知名公司的150 道编程面试题,并针对每一道面试题目,分别给出了详细的解决方案。 本书适合程序开发和...

    程序员面试金典(第5版).rar

    本书是原谷歌资深面试...第8~9 章从数据结构、概念与算法、知识类问题和附加面试题4 个方面,为读者呈现了出自微软、苹果、谷歌等多家知名公司的150 道编程面试题,并针对每一道面试题目,分别给出了详细的解决方案。

    程序员面试金典-卷一

    第8~9 章从数据结构、概念与算法、知识类问题和附加面试题4 个方面,为读者呈现了出自微软、苹果、谷歌等多家知名公司的150 道编程面试题,并针对每一道面试题目,分别给出了详细的解决方案。 本书适合程序开发和...

    程序员面试金典-卷二

    第8~9 章从数据结构、概念与算法、知识类问题和附加面试题4 个方面,为读者呈现了出自微软、苹果、谷歌等多家知名公司的150 道编程面试题,并针对每一道面试题目,分别给出了详细的解决方案。 本书适合程序开发和...

    Cracking the Coding Interview 6th Edition

    亚马逊超级畅销书,...第8~9 章从数据结构、概念与算法、知识类问题和附加面试题4 个方面,为读者呈现了出自微软、苹果、谷歌等多家知名公司的150 道编程面试题,并针对每一道面试题目,分别给出了详细的解决方案。

    程序员面试金典(第五版)-高清扫描PDF

    本书是原谷歌资深面试官的经验之作,全面而详尽地介绍了程序员应当如何...为读者呈现了出自微软、苹果、谷歌等多家知名公司的150 道编程面试题,并针对每一道面试题目,分别给出了详细的解决方案。是刷题面试的好资料。

    front-end-interview:前端面试问题汇总

    (html&&CSS)基础面试题(一般大公司很少问到) JS 算法与数据结构 HuangCongQing/JS-AlgorithmsAndDataStructure hyccpq/js-Data-Structures-and-Algorithms zouyang1230/JS-algorithms matthew-sun/data-...

    100层楼2个鸡蛋C程序递归实现

    来自一道google面试题,本资源以VC编译器下的C递归实现,楼层数和鸡蛋数作为可变输入参数,输出(测试出保证鸡蛋不破的最高安全层的)最小次数。比如100层楼2个鸡蛋输出结果14:表示2个鸡蛋测试100层楼以获得最高...

    leetcode知乎-lc_books:从Leetcode、CodingInterviews等中精心挑选的算法问题的解决方案,由Java解决

    之前做题,几乎只能去参考Leetcode里面Discussion的解法和Google别人的解法,一道题当时做完觉得没什么貌似是理解了,但是等一段时间再次碰到,又不知道如何下手,这就是典型的没有理解和掌握透。所以在这里,我们...

    leetcode中国-leetcode:一起学习算法

    leetcode中国 home comment heroImage footer true false /favicon.png ...算法是很重要的基础素质,而且也能保持你的思维状态。可能你在工作中,很多业务,很难用得上算法。...每一道题,你不看题解完全独立做

Global site tag (gtag.js) - Google Analytics