筆試題解答(個人水平有限,有錯誤之處請指出)

2021-04-30 05:08:36 字數 1148 閱讀 1684

斐波那契數列的每一項f(n),計算出f(n)剛開到這道題,哇,太簡單了吧,有個遞迴就可以搞定斐波那契數列啦,於是寫了乙個簡單的遞迴實現的斐波那契數列演算法:

int   fib(int   n) 

else  

}      

試著執行了一下,當n的值大於40時,執行速度就慢了很多了,試想一下距離int所能表示的最大值2^31-1還遠著呢,看來用遞迴是不可行的。

接下來想了想,既然遞迴能夠實現,那迴圈肯定也是實現斐波那契數列的啦~~

int   f1(int   n)  

if(n%2==0)

return b;

else

return a;

}果然不出所料,迴圈實現的這個演算法比遞迴真的要快上n倍,而且n值能夠取得最大值是依賴於int能夠表示的範圍的,超出了int表示範圍就變成負數了。n=46時,是int能夠表示的最大的斐波那契值了。

其實這道題用迴圈就可以解出來了,不過對於執行速度還是有要求的話,我們就可以直接用斐波那契數列的通項公式算出具體的某個值。通項為f(n)=(1/√5)*(√5表示根號5)

int f2(int n)

這個演算法當然就更快了,都不用遞迴或迴圈,只要輸入乙個n值就可以直接算出來了,數學公式果然是強大的解題工具。

這道題的解題過程如下:

int f2(int n)

int main()

cout《結果n=46

現在算一下這幾個演算法執行的時間長短:

在網上搜了個比較精確的計數器程式:

double gettime2() //使用高精度計時器

queryperformancecounter( &performancecount );     

t=(double)performancecount.quadpart / (double)s_freq.quadpart;      

return t;

}測量程式如下:

int main()

執行結果如下:

fib(n)遞迴:0.722634

f1(n)迴圈:7.82222e-006

f2(n)公式:3.35238e-006

從上面的執行時間可以看出來,遞迴實在是太慢了,公式法的速度優於迴圈,不過迴圈也比遞迴快很多了,都不是乙個數量級的差別了~~

筆試題一 解答

這個題目是在裡面找到的,是乙個帖子,檢視了跟帖的大牛們的答覆,自己也簡單想了一下,如果我們只考慮兩類表均在乙個伺服器上儲存著,那麼我覺得最好的方法應該就是建乙個臨時表,將第2類表中的30張表的userid去重的插入到臨時表中,然後將第一類資料表與該臨時表進行比較,就可以 這樣算是以空間換取時間吧!這...

微軟2014筆試題21題解答(有點挫)

題目如上圖所示。這裡給出兩種解法 第一種是自己想的,時間複雜度o n 2 第二種方法實現的是實驗室乙個大牛的想法,時間複雜度o n 如下 void reorder1 node root changetimes sum 2 if sum 0x01 insert num changetimes stop...

騰訊筆試題解

1,把整數分成256m段,每段可以用64位整數儲存該段資料個數,256m 8 2g記憶體,先清0 2,讀10g整數,把整數對映到256m段中,增加相應段的記數 3,掃瞄256m段的記數,找到中位數的段和中位數的段前面所有段的記數,可以把其他段的記憶體釋放 4,因中位數段的可能整數取值已經比較小 如果...