分享
 
 
 

GOOGLE面试题--我的答案

王朝other·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

这个题目的英文原题是:

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.

请大家写出自己的算法,并统计一些在你机器上计算出1111111110的时间。为了不影响大家的思路,我最后贴上我的程序。

语言不限,随便了。

CSDN论坛帖子链接:

google的一道面世题,算法高手进来看看

---------------------------------------------

我在原题的基础上“增加了难度”,即求出小于MAX的所有f(n)=n的数。

程序运行结果:

dex_c:2485 dex_f:4960 time:30

递归调用2485次,计算某个数的1的个数4960次(包括84次打印时的验证dummy调用),耗时30ms

说明:

foo--某个数的1的个数,我本来写了一个,原理一样,但代码没有这么漂亮,比较长,所以干脆直接用帖子里的一个算法;

思路--从1到MAX步长逐渐增大的2分法。

---------------------------------------------

[code]#include <stdio.h>

#include<windows.h>

typedef unsigned long number_t;

int count=0;

int dex_c=0;

int dex_f=0;

number_t foo(number_t n)

{

dex_f++;

number_t num, k, r, d;

number_t x;

for(num = k = r = 0, d = 1; n; n /= 10) {

x = n % 10;

num += x * k + (x > 1 ? d : (x == 1 ? r + 1 : 0));

r += x * d;

k = k * 10 + d;

d *= 10;

}

return num;

}

inline void found(number_t x)

{

printf("%d: f(%d)=%d\n",count+1,x,foo(x));count++;

}

void scan(number_t a,number_t b)

{

// printf("scan %d %d\n",a,b);

if ((a>b)||(a<0)||(b<0)) return;

dex_c++;

number_t an=foo(a);

if (a==an) found(a);

if (a==b) return;

number_t bn=foo(b);

number_t k=a+(b-a)/2;

if ((a>bn) || (b<an)) return;

if (k>=(a+1)) scan(a+1,k);

if ((k+2)<=b) scan(k+1,b-1);

if (b==bn) found(b);

}

int main ()

{

int t=GetTickCount();

const number_t MAX=3000000000L;

number_t n=1;

number_t i;

number_t k=1,p=1;

found(0);

while(1)

{

n=n*10;

for (i=1;i<=9;i++)

{

p=k;

k=i*n;

if (k>=MAX)

{

scan(p,MAX);

t=GetTickCount()-t;

printf("dex_c:%d dex_f:%d time:%d\n", dex_c, dex_f, t);

getchar();

return 0;

}

scan(p,k-1);

}

}

}[/code]

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有