免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yzc2002
打印 上一主题 下一主题

据说是google的面试题,看谁的快 [复制链接]

论坛徽章:
0
101 [报告]
发表于 2007-03-03 11:13 |只看该作者
恩~看完一页~有点意思~~顶一个

[ 本帖最后由 huntrsky 于 2007-3-3 11:16 编辑 ]

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
102 [报告]
发表于 2007-03-03 13:52 |只看该作者
下面的程序是按照LZ的遍历算法编写的,但结果不正确.
前面的数只需0.几秒就出来了.但最后一个数老是出不来,另外中间少了几个数

  1. #include <stdio.h>

  2. unsigned f(unsigned n){
  3.         static unsigned base[][2]={
  4.                 1,          0,                     /* 0 */
  5.                 10,         0*10       +1,         /* 1 */
  6.                 100,        1*10       +10,        /* 20 */
  7.                 1000,       20*10      +100,       /* 300 */
  8.                 10000,      300*10     +1000,      /* 4000 */
  9.                 100000,     4000*10    +10000,     /* 50000 */
  10.                 1000000,    50000*10   +100000,    /* 600000 */
  11.                 10000000,   600000*10  +1000000,   /* 7000000 */
  12.                 100000000,  7000000*10 +10000000,  /* 80000000 */
  13.                 1000000000, 80000000*10+100000000, /* 900000000 */
  14.         };
  15.         int i, j;
  16.         unsigned cnt;

  17.         cnt = 0;
  18.         for(i = sizeof(base)/sizeof(base[0]) - 1; i >= 0; i--){
  19.                 for(j = 0; j < 10; j++){
  20.                         if(n < base[i][0]){
  21.                                 if(j == 1){
  22.                                         cnt += n + 1;
  23.                                 }
  24.                                 break;
  25.                         }
  26.                         cnt += base[i][1];
  27.                         if(j == 1){
  28.                                 cnt += base[i][0];
  29.                         }
  30.                         n -= base[i][0];
  31.                 }
  32.         }
  33.         return cnt;
  34. }

  35. int k(unsigned n){
  36.         static unsigned base[] = {
  37.                 1,
  38.                 10,
  39.                 100,
  40.                 1000,
  41.                 10000,
  42.                 100000,
  43.                 1000000,
  44.                 10000000,
  45.                 100000000,
  46.                 1000000000,
  47.         };
  48.         int i;

  49.         for(i = 0; i < sizeof(base)/sizeof(base[0]); i++){
  50.                 if(n > base[i]){
  51.                         break;
  52.                 }
  53.         }
  54.         return i + 1;
  55. }

  56. unsigned max(unsigned a, unsigned b){
  57.         return a > b ? a : b;
  58. }

  59. int main(void){
  60.         static unsigned x[] = {
  61.                 1,
  62.                 199981,
  63.                 199982,
  64.                 199983,
  65.                 199984,
  66.                 199985,
  67.                 199986,
  68.                 199987,
  69.                 199988,
  70.                 199989,
  71.                 199990,
  72.                 200000,
  73.                 200001,
  74.                 1599981,
  75.                 1599982,
  76.                 1599983,
  77.                 1599984,
  78.                 1599985,
  79.                 1599986,
  80.                 1599987,
  81.                 1599988,
  82.                 1599989,
  83.                 1599990,
  84.                 2600000,
  85.                 2600001,
  86.                 13199998,
  87.                 35000000,
  88.                 35000001,
  89.                 35199981,
  90.                 35199982,
  91.                 35199983,
  92.                 35199984,
  93.                 35199985,
  94.                 35199986,
  95.                 35199987,
  96.                 35199988,
  97.                 35199989,
  98.                 35199990,
  99.                 35200000,
  100.                 35200001,
  101.                 117463825,
  102.                 500000000,
  103.                 500000001,
  104.                 500199981,
  105.                 500199982,
  106.                 500199983,
  107.                 500199984,
  108.                 500199985,
  109.                 500199986,
  110.                 500199987,
  111.                 500199988,
  112.                 500199989,
  113.                 500199990,
  114.                 500200000,
  115.                 500200001,
  116.                 501599981,
  117.                 501599982,
  118.                 501599983,
  119.                 501599984,
  120.                 501599985,
  121.                 501599986,
  122.                 501599987,
  123.                 501599988,
  124.                 501599989,
  125.                 501599990,
  126.                 502600000,
  127.                 502600001,
  128.                 513199998,
  129.                 535000000,
  130.                 535000001,
  131.                 535199981,
  132.                 535199982,
  133.                 535199983,
  134.                 535199984,
  135.                 535199985,
  136.                 535199986,
  137.                 535199987,
  138.                 535199988,
  139.                 535199989,
  140.                 535199990,
  141.                 535200000,
  142.                 535200001,
  143.                 1111111110,
  144.         };
  145.         unsigned n;
  146.         unsigned m;
  147.         int i;

  148.         for(i = 0; i < sizeof(x)/sizeof(x[0]); i++){
  149.                 m = f(x[i]);
  150.                 if(m != x[i]){
  151.                         printf("%u\n", x[i]);
  152.                 }
  153.         }

  154.         printf("my result\n");
  155.         n = 1;
  156.         while(n < ~0){
  157.                 m = f(n);
  158.                 if(m == n){
  159.                         printf("%u\n", m);
  160.                         n++;
  161.                 }else if(m > n){
  162.                         n = m;
  163.                 }else{
  164.                         m = n + (n - m);
  165.                         n = max(m / k(m), n + 1);
  166.                 }
  167.         }
  168.         return 0;
  169. }
复制代码

论坛徽章:
0
103 [报告]
发表于 2007-03-03 14:29 |只看该作者
ACM的题, 怎么扯上google了?

论坛徽章:
0
104 [报告]
发表于 2007-03-27 12:48 |只看该作者
原帖由 bleem1998 于 2006-3-29 12:14 发表
写了个伪的
大伙指正
[code]
//计算一个整数里还有多少个1,有几个返回几
int num_a_int(int papapa)
{
        //这个函数对谁来说都easy吧
        return 0;
}

//这个函数就是题目里要求的那个函数 ...


你这个递归太多,遇到大的数会耗尽栈内存
出现segmentatin fault

论坛徽章:
0
105 [报告]
发表于 2008-06-03 10:30 |只看该作者
来个快的,16毫秒,vc6


#include "math.h"
#include "stdio.h"
#include "windows.h"

#define N 19

static __int64 Sum[N+1];
static __int64 TenPow[N+1];

struct SRange
{
        __int64 nBegin;
        __int64 nEnd;
        __int64 nLmin;
        __int64 nLmax;
        int n;        //the numbers of the number
        int nLevel;
        int nIndex[N];
        int nCurIndex;
        int nOneAppearTimes;
};

bool CanBeDivide(SRange * pR)
{
        if(pR->nBegin > pR->nLmax)
                return false;

        if(pR->nEnd < pR->nLmin)
                return false;

        return true;
}

void DivideRange(SRange * pR)
{
        if(pR->nLevel == 1)        //iterator end condition
        {
                __int64 nTotalOnes[10];
                __int64 nTemp = 0;
                for(int i = 0; i < 10; i++)        //calculate the the numbers of the number
                {
                        if(i == 0)
                                nTotalOnes[0] = pR->nLmin + pR->nOneAppearTimes;
                        else if(i == 1)
                                nTotalOnes = nTotalOnes[i-1] + pR->nOneAppearTimes + 1;
                        else
                                nTotalOnes = nTotalOnes[i-1] + pR->nOneAppearTimes;

                        if(nTotalOnes == pR->nBegin + i)
                                printf("%I64d\n", nTotalOnes);
                }
                return;
        }
        else
        {
                SRange range;
                __int64 nLMin = pR->nLmin;
                int nDivParts = pR->n == pR->nLevel ? 9 : 10;
                for(int i = 0; i < nDivParts; i++)
                {
                        range.n = pR->n;
                        range.nLevel = pR->nLevel - 1;
                       
                        for(int j = 0; j <= pR->nCurIndex; j++)
                                range.nIndex[j] = pR->nIndex[j];

                        range.nIndex[j] = i;
                        range.nCurIndex = j;
                        range.nOneAppearTimes = pR->nOneAppearTimes;

                        //counter history 1 apeared times
                        if(range.nCurIndex == 0)
                        {
                                if(range.nIndex[range.nCurIndex] == 0)
                                        range.nOneAppearTimes = pR->nOneAppearTimes + 1;
                        }
                        else
                        {
                                if(range.nIndex[range.nCurIndex] == 1)
                                        range.nOneAppearTimes = pR->nOneAppearTimes + 1;
                        }

                        range.nBegin = pR->nBegin + i * TenPow[range.nLevel];
                        range.nEnd = pR->nBegin + (i+1) * TenPow[range.nLevel] - 1;

                        range.nLmin = nLMin;
                        range.nLmax = range.nLmin + range.nOneAppearTimes * TenPow[range.nLevel] + Sum[range.nLevel];

                        nLMin = range.nLmax;

                        if(CanBeDivide(&range))
                                DivideRange(&range);
                }
        }
}

__int64 main(__int64 argc, char* argv[])
{

        unsigned int a=  GetTickCount();
       
        //iterator method
        Sum[0] = 0;
        Sum[1] = 1;

        TenPow[0] = 1;
        TenPow[1] = 10;

        for(int i = 2 ; i <= N; i++)
        {
                TenPow = (__int64)pow(10, i);
                Sum = Sum[i-1]*10 + TenPow[i-1];
        }

        printf("1\n");

        for(i = 1; i <= N; i++)
        {
                SRange range;
                range.nBegin = TenPow[i-1];
                range.nEnd         = TenPow - 1;

                range.nLmin = Sum[i-1];
                range.nLmax = Sum;

                range.n = i;
                range.nLevel = i;
                range.nOneAppearTimes = 0;
                range.nCurIndex = -1;

                DivideRange(&range);
        }
        a = GetTickCount() - a;
        printf("total %d ms", a);       

        return 0;
}

论坛徽章:
0
106 [报告]
发表于 2008-06-03 10:33 |只看该作者
结果:
1
199981
199982
199983
199984
199985
199986
199987
199988
199989
199990
200000
200001
1599981
1599982
1599983
1599984
1599985
1599986
1599987
1599988
1599989
1599990
2600000
2600001
13199998
35000000
35000001
35199981
35199982
35199983
35199984
35199985
35199986
35199987
35199988
35199989
35199990
35200000
35200001
117463825
500000000
500000001
500199981
500199982
500199983
500199984
500199985
500199986
500199987
500199988
500199989
500199990
500200000
500200001
501599981
501599982
501599983
501599984
501599985
501599986
501599987
501599988
501599989
501599990
502600000
502600001
513199998
535000000
535000001
535199981
535199982
535199983
535199984
535199985
535199986
535199987
535199988
535199989
535199990
535200000
535200001
1111111110
total 16 msPress any key to continue

论坛徽章:
0
107 [报告]
发表于 2008-08-10 21:06 |只看该作者
原帖由 michaelds 于 2007-3-2 21:57 发表
今天无意中搜到了这个帖子,Google出的题就是有味道,在尝试后发现确实考得有独到之处。纵览所有回帖,楼主对该问题是最深入,最细致,也是最接近完美答案的。
不过当把一个问题拆解到统计学的这种角度,程序本 ...

正如如果魔术的谜底被揭开了,那就没意思了。
问题不是出在魔术身上,问题出在人的大脑上。

论坛徽章:
0
108 [报告]
发表于 2008-08-10 22:10 |只看该作者
看了以上这些贴子,代码很多啊,大部分没细看,哈哈,也没看懂,如果要算1的话,本人的思路是这样的:个位数只有1个1,十位数1的个数为个位数与十位数的1的组合即:10.11.12.13..19,等,百位数为十位数与个位数的组合,100,111,112等,从个位数开始,一直迭加到《=n为止。代码不写了,应该很容易实现吧,效率应该比一个个数的去循环好一点点吧

论坛徽章:
0
109 [报告]
发表于 2008-08-11 01:11 |只看该作者

回复 #1 yzc2002 的帖子

6:06pm kemian ~/test/c> time ./a.out
f(199981) = 199981
0.019u 0.006s 0:00.02 50.0%     16+528k 0+0io 0pf+0w

论坛徽章:
0
110 [报告]
发表于 2009-03-04 17:19 |只看该作者
原帖由 converse 于 2006-3-29 16:52 发表
flw,这个问题考算法,不是考的语言吧...哈哈

版主不会出错,出错的永远是实习版主,出了问题请先从自己身上考虑自己是不是犯错了


从这个回帖就知道你的水平了,不懂算法,自以为是,心胸狭窄,你这种水平还可以当版主,简直太侮辱这个板块了,幸好现在已经不是了,还是劝你不要在这个版混了,你水平差大家都知道了,还是该干嘛干嘛,这里真的不适合你
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP