免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
51 [报告]
发表于 2006-03-31 23:04 |只看该作者

天啊,怎么俺算起来就直接溢出了呢

俺用java写了个,大家看看问题在哪


public class Numen
{
  public long f(int n)
   {
          if (n == 1)
          {
                  return 1;
          }
          
          else return f(n-1) + y(n);
   }
  
  public int y(int n)
  {
          String s = new Long(n).toString();
          
       
          
          int iNum = 0;
          
          for(int i = 0;i<  s.length(); ++i)
          {
                  String t = s.substring(i,i+1);
                  
                  if ( t.equals("1"))
                  {
                          ++ iNum;
                  }
          }
          
          return iNum;
          
          
  }
}


public class Main {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Numen numen = new Numen();
               
                /*
                for( long i =0;i < Long.MAX_VALUE,f(n) ;++i)
                {
                        if ( numen.f((int)i) == i )
                        {
                                System.out.println(i);
                        }
                }
                */
                System.out.println(numen.f(199981));
        }

}

论坛徽章:
0
52 [报告]
发表于 2006-04-01 00:18 |只看该作者
In business world, money is king, so we have a phrase -- cash king .  Google is in this situation now.

In computer world, algorithm is king, I create a phrase:  alg-king. haha..  Google is in this situation too..

论坛徽章:
0
53 [报告]
发表于 2006-04-01 03:07 |只看该作者
用C写了一个算到结果为6位数的时候还可以不到1秒,但结果过了6位之后就不行了,写这个算法用了10多分钟啊!!!

论坛徽章:
0
54 [报告]
发表于 2006-04-01 03:12 |只看该作者
刚刚又想了起来,用移位的怎么样?

论坛徽章:
0
55 [报告]
发表于 2006-04-01 03:18 |只看该作者
最后看了看前面兄弟的贴,说白了考的是脑袋的机动性和经验,谁要是以前碰到过类似的题那不一下就把OFFER给KO了。不过佩服机动性比较好的那几位。

论坛徽章:
0
56 [报告]
发表于 2006-04-01 06:32 |只看该作者
对于数A=(anan-1an-2.......a2a1a0)计1个数为f(A)

10^n内的1的个数:个位、十位、百位....(n)位的1都是10^(k-1),还有一个1,总共是n*10^(n-1)+1计为p(n)+1
1 ~ 1
10 ~ 1 + 1
100 ~ 20 + 1
1000~ 300 +1
10000~ 4000 + 1
100000 ~ 50000 +1
..............
10^10 ~ 10^10 +1
p(0)=0 p(1) = 1 p(2)=20 p(3) = 300 ....  p(10) = 10^10
对于数A=(anan-1an-2.......a2a1a0)
an=1                          f(A) = p(n)     +     (an-1an-2.......a2a1a0) +1         + f((an-1an-2.......a2a1a0))
an >1                         f(A) = an * p(n)   +     10^n                    + f((an-1an-2.......a2a1a0))

这样就定义了f(A)递归函数。
从p(10)可以看出A<10^n
注意到 f((an-1an-2.......a2a1a0)) <= p(n) 可以估计f(A)的上界
先比较f(A)前几项与A的大小,若A 比f(A)的上界大,就不需要再计算后面的位,这样
只需很少计算就可以解决。

论坛徽章:
0
57 [报告]
发表于 2006-04-01 20:38 |只看该作者

反过来试试

计算10里面有几个1, 100里有几个1, 1000里有几个1...

论坛徽章:
0
58 [报告]
发表于 2006-04-02 00:13 |只看该作者
好答案,Google对于数学能力的要求还是比较高,面试短时间能算出来不容易

论坛徽章:
0
59 [报告]
发表于 2006-04-02 14:33 |只看该作者
原帖由 TurboDisk 于 2006-4-1 03:07 发表
用C写了一个算到结果为6位数的时候还可以不到1秒,但结果过了6位之后就不行了,写这个算法用了10多分钟啊!!!
6位才10万数量级,perl 的模式匹配都不止这个速度。写代码只要1分钟

  1. #! /usr/bin/perl
  2. use warnings;
  3. use strict;

  4. my $i = 1;
  5. my $tmp = 0;

  6. while (1) {
  7.     $tmp++ while ($i =~ /1/g);

  8.     print $i,"\n" if ($tmp == $i);
  9.     $i++;
  10. }
复制代码

论坛徽章:
0
60 [报告]
发表于 2006-04-03 12:26 |只看该作者
#include <stdio.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
   long    num = 0 ;
   long    sum = 0 ;
   long    val = 0 ;
   register    i = 1 ;

   num = atol( argv[1] ) ;
   while(i<=num)
   {
       val = i ;
       while( val )
       {
           if( val % 10 == 1 ) sum++ ;
           val = val / 10 ;
       }
       if( i == sum ) printf("next is: [%ld]\n", i ) ;
       i++ ;
   }
   exit(0) ;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP