貢獻者:達摩 - Daruma
現在有一個費氏數列 ,定 、。
現在題目給一個非負整數 ,請算出 的值。
用遞迴的方法來算答案的話重複的計算會算很多次,因此使用迭代的方式依序算出 , 一直到算出 來避免重複計算的問題。
算 的時候只需要知道 ,因此可以只用長度為 的陣列來記錄。
如果將 寫成 ,那要得到 的話,只需要乘上 即可。
可以推得 ,而計算 的時間複雜度是 。
給定一個 的收納盒,而你現在手邊有許多積木,積木的形狀都是長方形,並且有 和 兩種大小,請問要用積木把收納盒放滿有幾種可能的放法。
定義 為填滿 的盒子的方法數,而 為填滿 ,並且第 行「只」填其中一格的方法數。
要填滿第 行有四種方法:
從上面三種方法可以得知 。
而第 行只填一格的方法則是用 或是 的積木,因此 。
題目給兩個非負整數 和 ,其中 代表現在有個長度為 的陣列 。
請你重新排列此陣列,使得陣列的第一項為 並且所有相鄰的數字在二進位表示中剛好只有一個位元不同。
注意第一項以及最後一項同樣視為相鄰。
先找出第一項為 的解 之後,假設 在 中的索引值為 (索引值從 開始),則把 的 以及 對調之後就是題目要的答案。
假設現在有長度為 的解 ,如下圖,其中兩個數字中間有線代表這兩個數字只差一個位元。
這時可以再複製一份長度為 的解,並且將複製後的每個元素都加 。
可以發現 、、 和 中間會有邊,因為他們只差一個位元(就是 ),如下圖。
因此就可以得到長度為 的解 。
在上個方法中,我們每次都是把陣列的後半的元素的 這個位元設為 ,然而其實可以透過確認 中的 這個位元是否為 來決定要設為 的是前半還是後半的元素。
因為迴圈結束後第一項就會是 ,所以也不需要額外的記憶體空間來重新排列。
給定一個鏈結串列,請將鏈結串列中的元素兩兩交換。
例如:
不可直接改鏈結串列的節點的值。
為了方便操作,在 head
前面再多加一個節點,而 for
迴圈的指標就從多加的那個節點開始,如果此節點後面有兩個以上的節點,就交換那兩個節點,之後再將指標指向下下個節點,就可以重複一樣的過程,交換剩下的節點。
使用指標的指標來節省上個方法的 sentinel
所使用的空間。
給定一個鏈結串列,前一題是兩個為一組做反轉,這次變成 個為一組來反轉,若是最後剩下的元素不到 個,就不進行反轉。
這邊使用遞迴來解這題,revK(pp, k)
會反轉以 *pp
為開頭的 個元素,並且遞迴的處理剩下的元素,直到剩下的元素小於 個。
06:22
interviewee
其他
interviewer
0:00 可以再跟面試者閒聊一下,讓彼此更多互動
8:15 沒有解釋為甚麼%2的n次方
程式碼的部分會讓人看得很亂,因為把次方都寫成1>>n跟2>>n
我覺得可以在for迴圈中間宣告像是
會讓程式碼可讀性更高,加上for迴圈變成兩半,看得不太舒服
9:47 在講解直接找到開頭就是start的解的部分,我第一次聽的時候沒聽懂,可能是我理解力差,但是我覺得跳過太多東西了,包括怎麼會有這個想法,以及透過檢查start的2^i的bit去決定前半後半,來讓開頭是start,兩個聽起來就會很跳,沒有解釋為甚麼這樣做,start就會是開頭,只是把解法講出來而已
聲音很炸
14:13 問的問題我覺得有點怪,因為p不管指向哪個我覺得差異只是實作方式,即使用兩個指標去操作我覺得問題也不大
17:57 我覺得問題有點沒有必要,因為說node更改會增加記憶體空間,但整個code也只有用到2個node,如果要改進的話,挑這個地方我覺得有更好的選擇,但在看完後面後,才了解到因為是遞迴會用到很大量的空間,這時候我覺得才會是合理的修改
在Follow up的部分,我是聽了下面的YT連結才了解
我覺得解釋部分可以再加強,包括畫圖的部分,在解釋想法時,圖上已經有之前畫過的線,變成你講的跟圖上的不一樣,看的就不是很明白,以及為甚麼要用遞迴,遞迴的作用是甚麼,我覺得都沒有很清楚的解釋到
dpi-1
, 若要表示 dpi_1
的話能夠說 “dp i underscore 1” 或是為變數命名表示int
在長度為 32 位元的情況下只能算到大約 Fib(47),64 位元能夠到大約 Fib(93)。直接說效率不足不太好,這部分可能可以當作延伸問題數學式:
可以看到每一步都會將 n 次式減半
假設時間複雜度為
時間複雜度
Recurrence Tree :
時間複雜度為二元樹的高度