contributed by < RusselCK
>
RusselCK
#12
: funcB(i)
的最後一句 是 return funcB(i - 1);
呼叫本身,符合 Tail Recurtion 的定義
編譯器 可以做 Tail Call Optimization, TCO
funcB(i)
來說,執行到 return funcB(i - 1)
後,接下來只要等 funcB(i - 1)
的回傳值就可以了
funcB(i)
已經做完了,不需要再留 stack space 給 funcB(i)
#5
: funcA(i)
的最後一句 為 return 5 * funcA(i - 1);
funcA(i - 1)
回傳 再 乘上 5 ,才是真正的返回值root
invertTree
解法 I :
Decimal | Binary | |
---|---|---|
m | 100 | 0110 0100 |
n | 120 | 0111 1000 |
m & n | 0110 0000 | |
n - m | 20 | 0001 0100 |
Mask | ~((1U << 5) - 1) |
1110 0000 |
Decimal | Binary | Decimal | Binary | Decimal | Binary |
---|---|---|---|---|---|
8 | 0000 1000 | 16 | 0001 0000 | ||
1 | 0000 0001 | 9 | 0000 1001 | 17 | 0001 0001 |
2 | 0000 0010 | 10 | 0000 1010 | 18 | 0001 0010 |
3 | 0000 0011 | 11 | 0000 1011 | 19 | 0001 0011 |
4 | 0000 0100 | 12 | 0000 1100 | 20 | 0001 0100 |
5 | 0000 0101 | 13 | 0000 1101 | ||
6 | 0000 0110 | 14 | 0000 1110 | ||
7 | 0000 0111 | 15 | 0000 1111 |
題目要求為 & & … & &
m & n
可以得知 結果之較大位數的 bits ( 第一個表格畫螢光的部份 )
接著我們還缺少的是,剩餘的 bits 應該為多少?
m
、n
相差 208 - __builtin_clz(20)
= 8 - 3 = 5因此,我們還須要一個 Mask = 1110 0000 = ~( 0001 1111 )
= ~( (0010 0000) - 1 ) = ~( (1 << 5) - 1 )
~((1U << count) - 1)
\ | d | b | b | c | a | |
---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0 | 0 | |
a | 1 | 0 | 0 | 0 | 0 | 0 |
a | 1 | 1 | 1 | 1 | 1 | 0 |
b | 0 | 1 | 1 | 0 | 1 | 0 |
c | 0 | 0 | 1 | 1 | 1 | 1 |
c | 0 | 0 | 0 | 0 | 0 | 1 |
DP[i][j]
: s1[0:i-1]
與 s2[0:j-1]
是否能組成 s3[0:i+j-1]
程式碼解析:
s1
+ s2
的長度是否等於 s3
的長度建立 DP 表格,並設置 dp[0][0]
為 1,其餘為 0
效能評估:
對 解法 I 進行的修改:
dp
array 由 2D 改為 1D
for
迴圈 合併成 一個程式碼解析:
#16
、#17
等價於 解法 I 的
#19
等價於 解法 I 的
#20
、#21
等價於 解法 I 的
故 RRR = i + j - 1
效能評估:
效能評估: