免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
71 [报告]
发表于 2006-04-10 17:18 |只看该作者

速度不够,不知道64位怎样?

unsigned long long int subf(unsigned long long int n)
{
        if(n==1) return 1;
        else if(n<10) return 0;
        else return subf(n/10)+subf(n%10);
}

unsigned long long int f(unsigned long long int n)
{
        if(n<=0) return 0;
        else return subf(n)+f(n-1);
}

论坛徽章:
0
72 [报告]
发表于 2006-04-14 18:15 |只看该作者
static int[] aQuotient;     //存放商
        static int[] aRemain;       //存放余数
        static int iDigit;          //存放整数的十进制位数

        static void Initial()
        {
            aRemain = new int[10];
            aQuotient = new int[aRemain.Length + 1];
            iDigit = 0;
        }

        static int Cope(int i)
        {
            Arrange(i);
            return Compute(iDigit - 1);
        }
        static void Arrange(int iInput)
        {
            int i = 0;          //循环变量,计数用
            //初始化
            aQuotient[0] = iInput;
            aRemain[0] = 0;

            for (i = 0; ; i++)
            {
                aRemain[i] = aQuotient[i] % 10;
                if (aRemain[i] == aQuotient[i])
                    break;
                aQuotient[i + 1] = aQuotient[i] / 10;
            }
            iDigit = i + 1;
            aQuotient[0] = 0;
            aQuotient[1] = aRemain[0];

            for (i = 2; i <= iDigit; i++ )
            {
                aQuotient[i] = aRemain[i - 1] * (int)Math.Pow(10,i - 1) + aQuotient[i - 1];
            }
        }

        static int Compute(int i)
        {
            int iCommon = 0;
            if (i == 0)
            {
                if (aRemain[0] == 0)
                    return 0;
                else
                    return 1;
            }
            if (aRemain[i] == 0)
                return Compute(i - 1);
            iCommon = (i) * (int)Math.Pow(10, (i - 1)) * aRemain[i] + Compute(i - 1);
            if (aRemain[i] == 1)
            {
                return aQuotient[i] + 1 + iCommon;
            }
            return (int)Math.Pow(10, i) + iCommon;
        }
    }

论坛徽章:
0
73 [报告]
发表于 2006-04-15 15:59 |只看该作者
我的程序:只能返回1~n之间 1 的个数。

  1. int f(int t, int station, int i_right)
  2. {
  3.         int current = 0;

  4.         current = pow(10, station-1 ) * station * t;

  5.         if(t > 1)
  6.                 current += pow(10, station);
  7.         else  // t == 1;
  8.                 current += i_right + 1;

  9.         return current;
  10. };


  11. //----------------------------------------------------------------------
  12. int _tmain(int argc, _TCHAR* argv[])
  13. {
  14.        
  15.         int count = 0;
  16.         int station = 1;
  17.         int i = 0;
  18.         int i_right = 0;  //从当前那位开始右边的数字

  19.         cout << "enter a number, please:"<< endl;
  20.         cin >> i;

  21.         if(i < 0)
  22.                 i = -1 * i;

  23.         if(!i)
  24.         {
  25.                 cout << "result is:0" << endl;
  26.                 return 0;
  27.         }

  28.         if(i < 10)
  29.         {
  30.                 cout << "result is:1" << endl;
  31.                 return 0;
  32.         }

  33. int i_for_SecondMethod = i;


  34.         if(i_right = i % 10)
  35.                 count++;

  36.                 i /= 10;

  37.                 int t = i % 10;
  38.                 int t2 = i;
  39.                

  40.                 while(t2)
  41.                 {
  42.                         while(!t)
  43.                         {
  44.                                 t2 /= 10;

  45.                                 t = t2 % 10;
  46.                                 station++;
  47.                         }

  48.                 i_right += t * pow(10, station) + i_right;

  49.                         count += f(t, station, i_right);

  50.                         t2 /= 10;
  51.                         t = t2 % 10;
  52.                         station++;

  53.                 }

  54.                 cout << "result:" << count << endl;


  55.         return 0;
  56. }

复制代码

论坛徽章:
0
74 [报告]
发表于 2006-04-15 18:48 |只看该作者
汗,那么多深度递归的,google的题目如果这么草草应付个谁都想得到的答案,那是肯定没戏的

flw估计也没吧

呵呵,别生气,或者考官看你会n国语言,没准考虑给你加分的

论坛徽章:
0
75 [报告]
发表于 2006-04-17 08:29 |只看该作者
原帖由 luojiannx 于 2006-4-15 18:48 发表
汗,那么多深度递归的,google的题目如果这么草草应付个谁都想得到的答案,那是肯定没戏的

flw估计也没吧

呵呵,别生气,或者考官看你会n国语言,没准考虑给你加分的


是指我吗?我没用递归

论坛徽章:
0
76 [报告]
发表于 2006-04-19 10:09 |只看该作者
我的想法是得到数(abcdefg...)中某一位为1且不大于该数的数目, 遍例所有位, 求和得到0到数字abcdefg之间含有1的个数。f(n)函数时间复杂度是log10(n).
这里还少一个对最大数字判断的算法(淘汰部分马上可确认n != f(n)的数)


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>

  4. using namespace std;

  5. int f(int n)
  6. {       
  7.         int total = 0;       
  8.         int m = ((int) log10(n)) + 1; //m是n的数字位数
  9.        
  10.         int ax;
  11.         float fn = (float) n;
  12.         for (int x=0; x<m; x++)  // 假设数字是[a0 a1 a2 ... ax ... am](a0,a1,a2...代表每一位)
  13.         {               
  14.                 int num = 0;
  15.                 ax = (int) (n / (int) pow(10, m-1-x)) % 10; //第x位的数
  16.                
  17.                 int n_begin = (int) floor(fn /pow(10, m-x)); // ax之间的数字[a0...a(x-1)]               
  18.                 switch (ax)
  19.                 {
  20.                         case 0: //0时 直接取[a0 a1 a2 .. a(x-1) 0 0 0...](m-x-1个0)
  21.                         {
  22.                                 num = n_begin * ((int) pow(10, m-x-1));
  23.                                 break;
  24.                         }
  25.                         case 1: //1 比0的情况多了[a(x+1) ... am]个数
  26.                         {
  27.                                 num = n_begin * ((int) pow(10, m-x-1));
  28.                                 int n_end = (int) floor(n % ((int) pow(10, m-x-1)));
  29.                                 num = num + n_end;
  30.                                 break;
  31.                         }
  32.                         default: // 其他的情况 为[a0 a1 a(m-1) + 1]*(10^(m-x-1))
  33.                         {
  34.                                 num = (n_begin + 1) * ((int) pow(10, m-x-1));
  35.                                 break;
  36.                         }
  37.                 }
  38.         }

  39.         if (total == n) printf("%d\n", n);
  40.         return total;
  41. }
  42. int main()
  43. {
  44.         for (int i=0; i<99999999; i++)
  45.         {
  46.                 f(i);
  47.         }       
  48.         return 0;
  49. }
复制代码

[ 本帖最后由 seaheart 于 2006-4-19 10:10 编辑 ]

论坛徽章:
0
77 [报告]
发表于 2006-04-19 13:02 |只看该作者
狗屁东西

论坛徽章:
0
78 [报告]
发表于 2006-04-19 13:34 |只看该作者

.......

这道题不难,甚至可以说很简单,重要的是速度,怎么好像很多人都没有意识到呢?
楼主说不用一秒钟算出给出结果,说实在的我不信!

还有大家不要只是给出程序,把运行结果也贴上来,好用来比较......

论坛徽章:
0
79 [报告]
发表于 2006-04-19 14:14 |只看该作者
呵~没想到这贴会被水成这样。。。
请版主取消精华,锁贴,让它沉了吧!
不然,会被同行瞧不起的~~

论坛徽章:
0
80 [报告]
发表于 2006-04-19 14:26 |只看该作者
原帖由 rihua 于 2006-4-19 13:02 发表
狗屁东西


你说话注意点啊,不喜欢可以不要进来说话,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP