cuiyi's blog(崔毅 crazycy)

          記錄點(diǎn)滴 鑒往事之得失 以資于發(fā)展
          數(shù)據(jù)加載中……

          google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)

          1 超級(jí)失敗的1:說(shuō)8點(diǎn)開(kāi)始,考試時(shí)間100分鐘 ,怎么算都是9:10交卷;9點(diǎn)一到匆匆交卷了,晚上躺床上才發(fā)現(xiàn)錯(cuò)也;

          2 超級(jí)失敗的2:把自個(gè)的生日又記錯(cuò)了;

          3 怕怕的發(fā)現(xiàn):發(fā)現(xiàn)mm還是超級(jí)可怕滴,眼睜睜看著一個(gè)騙局,哎,也得謹(jǐn)慎些以防上當(dāng)受騙啊;

          題目如下:

          T( 0 ) = 1 ; T(1)=1;T(2)=2;T(n)=T(n-1)+T(n-2)+T(n-3);
          用最優(yōu)方式求T(n) ;

          int?T(int?n)?{
          }

          可以用最熟悉的語(yǔ)言寫(xiě)


          在考場(chǎng)的第一個(gè)做法

          ?1 public ? class ?T? {
          ?2 ? public ? int ?t( int ?n) {
          ?3 ?? if ?(n? == ? 0 )? {
          ?4 ??? return ? 1 ;
          ?5 ??}
          ? else ? if ?(n? == ? 1 )? {
          ?6 ??? return ? 1 ;
          ?7 ??}
          ? else ? if ?(n? == ? 2 )? {
          ?8 ??? return ? 2 ;
          ?9 ??}
          ? else ? {
          10 ??? return ?t(n - 1 )? + ?t(n - 2 )? + ?t(n - 3 );
          11 ??}
          ?
          12 ?}

          13 }

          當(dāng)時(shí)發(fā)現(xiàn)時(shí)間夠用,進(jìn)行了公式推理,但未得出規(guī)律的真諦
          每個(gè)都與T(3)可以直接發(fā)生關(guān)系,關(guān)系是2的冪次方,但最終沒(méi)有得出公式
          遂改進(jìn)如下:

          ?1 public ? class ?T? {
          ?2 ? public ? int ?t( int ?n) {
          ?3 ?? if ?(n? == ? 0 )? {
          ?4 ??? return ? 1 ;
          ?5 ??}
          ? else ? if ?(n? == ? 1 )? {
          ?6 ??? return ? 1 ;
          ?7 ??}
          ? else ? if ?(n? == ? 2 )? {
          ?8 ??? return ? 2 ;
          ?9 ??}
          ? else ? {
          10 ??? return ? 2 ? * ?t(n - 1 )? - ?t(n - 3 );
          11 ??}
          ?
          12 ?}

          13 }

          晚上躺床上,怎么可能這樣直接呢?
          突然想到最起碼的一點(diǎn)就是重復(fù)數(shù)的計(jì)算,應(yīng)該進(jìn)行保存;
          如果正向逐個(gè)求然后保存,可行;
          如果倒向如何保存,尚未想好
          大家來(lái)仁者見(jiàn)仁一下哦(有更好的思路的請(qǐng)指點(diǎn))
          public class T {
          ?Map values = new HashMap();
          ?
          ?public int t(int n){
          ??int result = 0;
          ??if (n == 0) {
          ??? result = 1;
          ??} else if (n == 1) {
          ???result = 1;
          ??} else if (n == 2) {
          ???result = 2;
          ??} else {
          ???result =? 2 * t(n-1) - t(n-3);
          ??}
          ??return result;
          ?}
          }

          posted on 2006-10-18 11:37 crazycy 閱讀(3135) 評(píng)論(23)  編輯  收藏 所屬分類(lèi): JavaSE語(yǔ)言

          評(píng)論

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          應(yīng)該是:
          public class T {
          public int t(int n){
          if (n == 0) {
          return 1;
          } else if (n == 1) {
          return 1;
          } else if (n == 2) {
          return 2;
          } else if (n == 3) {
          return 4;
          } else {
          return 2 * t(n-1) - t(n-4);
          }
          }
          }
          2006-10-18 12:37 | katlao

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          增開(kāi)7群,號(hào)碼 30440732
          8群 30756649
          9群 30178567
          10群 28694497

          我們的qq群:15096318 學(xué)習(xí)程序的都可以來(lái)
          2006-10-18 14:16 | 123bingbing

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          @katlao

          對(duì);呵呵;這個(gè)地方是記錯(cuò)了;上交的卷子是這樣寫(xiě)的;

          覺(jué)得還應(yīng)該能繼續(xù)推導(dǎo)的;當(dāng)時(shí)在考場(chǎng)上沒(méi)有推導(dǎo)出來(lái);因?yàn)槎寂ct(3)有2的冪方關(guān)系

          另外,我覺(jué)得另外的思路上正向做,并且存儲(chǔ)每一個(gè)數(shù)字;

          我現(xiàn)在思考的是倒向是否有辦法存儲(chǔ)呢?
          2006-10-18 16:21 | crazycy

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          @123bingbing

          我曾經(jīng)加入了47個(gè)群;呵呵,現(xiàn)在只留了4個(gè),拒絕新的群了。
          2006-10-18 16:31 | crazycy

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          最優(yōu)的算法是推導(dǎo)出遞推公式的,但是那個(gè)要用到矩陣,有一些技巧來(lái)推,我當(dāng)時(shí)也沒(méi)有推出來(lái)。次優(yōu)的一個(gè)方案是對(duì)中間的結(jié)果進(jìn)行緩存,dp阿,O(n)的復(fù)雜度,而不是O(3^n)
          ----------------------------------------------------
          int buffer[n+1]

          buffer[0] = 1; buffer[1] = 1; buffer[2] = 2;

          for(int i = 3; i<=n; i++)
          buffer[i] = buffer[i - 1] + buffer[i - 2] + buffer[i - 3];

          return buffer[n];
          2006-10-18 19:38 | yangfan

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          我把樓上的作了一下修改,也不知道是改好了,還是改差了,呵呵
          就是把計(jì)算的結(jié)果存儲(chǔ)到數(shù)組中值最小的元素當(dāng)中,因?yàn)樗鼘?duì)以后的計(jì)算已經(jīng)沒(méi)有用處了
          雖然節(jié)省了空間,但是不知道速度會(huì)不會(huì)明顯變慢

          public static int t1( int n ){
          if( n==0 ){
          return 1;
          }else if( n== 1 ){
          return 1;
          }else if( n==2 ){
          return 2;
          }else{
          int[] b= new int[3];
          b[0] = 1;
          b[1] = 1;
          b[2] = 2;
          for( int i = 3; i < n+1; i++ ){
          b[i%3] = b[i%3] + b[(i+1)%3] + b[(i+2)%3];
          }
          return b[n%3];
          }
          2006-10-18 22:38 | 馬嘉楠

          # 我的  回復(fù)  更多評(píng)論   

          #!/usr/bin/python
          x=[1,1,2]
          def T(n):
          if n > len(x)-1:
          x.append(T(n-1)+T(n-2)+T(n-3))
          return x[n]

          import sys
          print T(int(sys.argv[1]))

          $ python test.py 100
          180396380815100901214157639
          2006-10-19 09:22 | oneleaf

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          重貼,不到1秒
          [code]
          #!/usr/bin/python
          x=[1,1,2]
          def T(n):
          if n > len(x)-1:
          x.append(T(n-1)+T(n-2)+T(n-3))
          return x[n]

          import sys
          print T(int(sys.argv[1]))
          [/code]

          $ python test.py 1000
          2758842807766486252615892411656158645133100149652696210351601845036392978912293462801016485671033253921841350537004356434253826361707295202024537559785200706502368152965047761644352316799391470273906561574500883480570560512982435681502330814068718832813973880527601
          2006-10-19 09:36 | oneleaf

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          @馬嘉楠
          不錯(cuò)!
          2006-10-19 12:28 | katlao

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          是不是還得考慮溢出的情況?
          2006-10-19 14:39 | Gasbarroni

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          #!/usr/bin/python

          import sys
          import datetime

          def T(n):
          if n == 0:
          return 1
          elif n == 1:
          return 1
          elif n == 2:
          return 2
          else:
          i = 3
          a = 1
          b = 1
          c = 2
          while i <= n:
          d = a + b + c

          if i == n:
          return d
          else:
          i = i + 1
          a = b
          b = c
          c = d

          t_start = datetime.datetime.today()

          print T(int(sys.argv[1]))

          t_end = datetime.datetime.today()

          print t_end - t_start


          當(dāng)n=100000時(shí)執(zhí)行時(shí)間為5.86秒
          2006-10-19 17:20 | wes109

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          都亂了,大家可以到http://bbs.btant.com/viewthread.php?tid=80&extra=page%3D1

          copy代碼
          2006-10-19 17:22 | wes109

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          @Gasbarroni

          哦 題目中聲明了不需考慮溢出

          呵呵
          2006-10-19 19:14 | crazycy

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   


          崔崔強(qiáng)啊,到google面試了?

          2006-10-19 23:49 | pigo

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          “發(fā)現(xiàn)mm還是超級(jí)可怕滴,眼睜睜看著一個(gè)騙局”,恩,建議你閉上眼過(guò)日子:)不然一睜眼就是怕怕了~
          2006-10-20 00:09 | qqsy

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          程序在運(yùn)行中由于數(shù)據(jù)值過(guò)大,會(huì)導(dǎo)致溢出,所以在程序中計(jì)算時(shí)間的準(zhǔn)確性值得懷疑.
          2006-10-20 10:07 | joycsharp@hotmail.com

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          給出此問(wèn)題的一種“記憶”解法(java解法)
          //n的值到了80應(yīng)該要超出Long型的范圍了
          static long[] knownT=new long[100];
          public static long t(n)
          { long t;
          if (knownT[n]!=0) return knownT[n];
          if(n<0) return 0;
          else if(n==0) return (knownT[n]=1);
          else if(n==1) return (knownT[n]=1);
          else if(n==2) return (knownT[n]=2);
          else if(n>=3) t=t(n-1)+t(n-2)+t(n-3);
          return (knownT[n]=t);

          }
          數(shù)據(jù)再大一些,只有使用BigInteger了。



          BigInteger
          2006-10-23 10:13 | oliver456

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          不好意思

          long t=0;

          要不然,會(huì)出現(xiàn)編譯錯(cuò)誤
          2006-10-23 10:17 | oliver456

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          @wes109

          亂了,亂了
          重新來(lái)過(guò),哈哈
          2006-10-23 22:55 | 馬嘉楠

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          #!/usr/bin/python
          x=[1,1,2]
          def T(n):
          if n < 3:
          return x[n]
          else:
          for i in xrange(n-2):
          x.append(sum(x))
          x.pop(0)
          return x[-1]

          import sys
          print T(int(sys.argv[1]))

          time t.py 150000

          real 0m9.860s
          user 0m9.553s
          sys 0m0.016s
          2006-11-01 20:43 | guyingbo

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)  回復(fù)  更多評(píng)論   

          int T(int n)
          {
          int i, temp, a[3] = {1, 1, 2};

          for (i = 3; i <= n; ++i)
          {
          temp = a[0] + a[1] + a[2];
          a[0] = a[1];
          a[1] = a[2];
          a[2] = temp;
          }

          return a[2];
          }
          2007-10-01 10:35 | peng

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)[未登錄](méi)  回復(fù)  更多評(píng)論   

          int T(int n){
          int a=0,b=2,c=1,d=1;
          for(int i=3; i<n; i++){
          a = b+c+d;
          d=c;c=b;b=a;
          }
          return a;
          }
          2008-03-08 16:52 | jimmy

          # re: google筆試的敗筆(大家來(lái)仁者見(jiàn)仁哦)[未登錄](méi)  回復(fù)  更多評(píng)論   

          暈 大家難道就沒(méi)有 發(fā)現(xiàn) 遞歸 運(yùn)算最大的問(wèn)題是重復(fù)計(jì)算嘛?
          2008-05-28 22:54 | 季失羽
          主站蜘蛛池模板: 沭阳县| 县级市| 巩义市| 南投县| 昌都县| 察雅县| 上犹县| 祥云县| 徐州市| 武义县| 永胜县| 吉木乃县| 新昌县| 聊城市| 武宣县| 溆浦县| 沙坪坝区| 英吉沙县| 阳泉市| 翁牛特旗| 榆树市| 河曲县| 深水埗区| 名山县| 自治县| 衡南县| 天台县| 和田县| 北海市| 闽侯县| 霍州市| 新野县| 榆社县| 平邑县| 长白| 沅江市| 简阳市| 镇宁| 宁晋县| 都昌县| 淅川县|