今天的面试题做错了,呜呜

作者: 分类: 代码 时间: 2012-03-05 评论: 61条评论

题目是这样的:

有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。比如f(13)=6,现在f(1)=1,问此后最大的f(n)=n的n是什么?

回学校,敲了一下自己当时写的代码,哎呀,错误百出啊。

当时,我是这样写的……

int f(int n,int count)
{
    if(n<10)
    {
        if(n==1) count++;
        return count;
    }
    
    if(n%10==1) count++;
    
    f(n/10,count);
}

int main()
{
    for(int i=1;i<100000;i++)
    {
        if(i==f(f))
        {
            printf("%d\n",i);
            getchar();
        }
    }
}

错到我都不忍心看了。错误点有以下:

1、递归的最终结果没有返回,应该是 return f(n/10,count); 才对。

2、我这个f函数,仅仅是求了n这个数中含的1而已嘛,离题万里。于是加了一个函数:

int f(int n)
{
    int sum = 0;
    for(int i=1;i<=n;i++)
    {
        sum += f(i,0);
    }
    return sum;
}

这个只需要一个参数的f,才是符合题意的f。

3、只是草率的随便写了一个返回去搜索,当然,我现在知道,在这个范围内一个符合要求的值也没有!!

正确的应该从0到0xFFFFFFFF,当然,这个时候不能用int了,而是unsigned int。


即使把这些全部改正过来,搜索效率也依然很低,因为f是一个循环。调用f的也是一个循环。

但是,我们知道n+1,其实就是在n的基础上加上n+1这个数中的1个个数,因此最终代码如下:

#include <windows.h>
#include <stdio.h>

//返回一个数字中包含"1"的个数
unsigned int f(unsigned int n,unsigned int count)
{
    if(n<10)
    {
        if(n==1) count++;
        return count;
    }
    
    if(n%10==1) count++;
    
    return f(n/10,count);
}

//效率低,重复计算,不使用
unsigned int f(unsigned int n)
{
    unsigned int sum = 0;
    for(unsigned int i=1;i<=n;i++)
    {
        sum += f(i,0);
    }
    return sum;
}


int main()
{
    double time = GetCurrentTime();
    unsigned int temp = 0; //保存上次计算结果
    for(unsigned int i=0;i<=0xFFFFFFFF;i++)
    {
        temp = f(i,temp);
        if(i==temp) printf("%u\n",i);
    }
    
    printf("Calc Over! %f",(GetCurrentTime()-time)/1000);
    getchar();
    return 0;
}

我计算的时候终点值是0x7FFFFFFF,因为那时候我没有改成unsigned int。而且已经能够得出答案,不用继续运行浪费时间。

 

还把另外一个不使用库函数实现strcpy的题目做成了实现strcat,我怎么了……o(︶︿︶)o 唉

最后贴一个简化版的代码,结果应该是199981。

#include <stdio.h>

int main()
{
    unsigned int count,num,temp;
    count = num = temp = 0;
    
    while(1)
    {
        temp = num;
        while(temp)
        {
            if(temp%10==1) count++;
            temp /= 10;
        }
        
        if(num==count) printf("%u\n",num);
        num++;
    }
    
    return 0;
}
标签: 面试经验

已有 61 条评论

  1. XXXXX
    XXXXX

    不错,你们公司招聘到人才了。就是你~

    时间: 2012-03-08 16:06
  2. Leopard
    Leopard

    最近去哪个公司面试了?

    时间: 2012-03-08 17:03
  3. hoobl
    hoobl

    加油 一定行的

    时间: 2012-03-10 17:55
  4. 猫毛卯帽
    猫毛卯帽

    我是学java和c#的,

    你这代码是什么语言?unsigned 和导入#include没见过

    大概看了你的逻辑好像很复杂,要是java应该处理更简单~主要手段:转型,求长度,遍历……

    时间: 2012-03-10 20:27
  5. 猫毛卯帽
    猫毛卯帽

    而且……这题后面我也没看明白——
    “现在f(1)=1,问此后最大的f(n)=n的n是什么?”

    不太不明白什么意思

    死循环,如果f(n)得到的结果就是参数n,就记录,而且这个n是要最大?

    时间: 2012-03-10 20:33
  6. 偶然来到
    偶然来到

    右上角那么大的CPP没看到么 居然还问是什么语言。。。

    时间: 2012-03-11 10:51
    1. 猫毛卯帽
      猫毛卯帽

      笑话,你面试java的问问他们cpp是什么,我还真不知道!

      卖弄!

      时间: 2012-03-11 22:13
  7. 1
    1

    呵呵,心智不健全的孩子

    时间: 2012-03-11 17:02
  8. 阿辉
    阿辉

    在天府软件园面试的?

    时间: 2012-03-11 21:49

评论已关闭