sysprog2020
目的: 引導學員挑戰 LeetCode 和複習記憶體管理機制
1
LeetCode 835. Image Overlap 給定二個影像 A 和 B,二者皆為大小相同的二維正方形矩陣,內部以二進位表示。我們轉換其中一個影像,向左、右、上,或下滑動任意數量的單位,並將其置於另一個影像之上,隨後,該轉換的重疊 (overlap) 指二個影像都有 1 的位置數量,注意:轉換不包含向任一方向旋轉。於是,最大可能的重疊為何?
範例 1:
3
1
的位置總數為 3
,見下圖紅色標記思路:找出所有 1 的位置,對兩個矩陣的所有這些位置進行求差,再統計這些差出現最多的次數。兩個坐標的差表示什麼?即是將其中一個坐標移動到另一個坐標需要移動的向量。於是,在走訪個別單元的過程中,我們找出 A
中所有值為 1
的坐標,移動到 B
中所有值為 1
的坐標需要移動的向量。於是乎,在這些向量中出現次數最多的向量,就是我們要求的整個矩陣應該移動的向量。
以下程式碼針對 LeetCode 835. Image Overlap,提出可能的解法:
請補完程式碼,使其符合 LeetCode 題目要求。
參考資料:
作答區
ITER1 = ?
(a)
for (int k = 0; k < n - j; k++) res[k + j] = res[k]
(b)
for (int k = 0; k <= n - j; k++) res[k + j] = res[k]
(c)
for (int k = n - j - 1; k >= 0; k--) res[k + j] = res[k]
(d)
for (int k = n - j; k >= 0; k--) res[k + j] = res[k]
ITER2 = ?
(a)
for (int k = j; k < n; k++) res[k + j] = res[k]
(b)
for (int k = j; k < n; k++) res[k - j] = res[k]
(c)
for (int k = j - 1; k < n; k++) res[k + j] = res[k]
(d)
for (int k = j - 1; k < n; k++) res[k - j] = res[k]
延伸題目:
2
LeetCode 1569. Number of Ways to Reorder Array to Get Same BST 給定一個陣列 nums
表示 到 的排列,依據元素在 nums
中的順序,依次插入一個初始為空的二元搜尋樹 (BST)。請你統計將 nums
重新排序後,滿足以下條件的個數:
nums
原本數值順序得到的 BST 相同。例如,給定 ,我們得到一棵 2
為 root、1
為 left 及 3
為 right 的樹。
陣列 也能得到相同的 BST,但 會得到一棵不同的 BST 。
由於答案可能會很大,請將結果對 取餘數。
範例 1
1
nums
重排, 可得到相同的 BST範例 2
5
範例 3
0
範例 4
19
範例 5
216212978
3216212999
216212978
根節點是陣列第一個數,分為左右兩個子樹,左右子樹之間的順序若不變即可
假設左子樹 長度 ,右子樹 長度 ,則有效組合數為
參考資訊:
注意:DECL
若是 int **cache
,會在 undefined behavior sanitizer (UBsan) 的執行階段遇到 Load of misaligned address
請補完程式碼,使其符合 LeetCode 題目要求。
作答區
DECL = ?
(a)
int cache[N][N]
(b)
int cache[N - 1][N - 1]
(c)
int cache[N + 1][N]
(d)
int (*cache)[N + 1]
(e)
int (*cache)[N]
INT = ?
(a)
comb[i][j] = (comb[i - 1][j] + comb[i - 1][j - 1]) % MOD
(b)
comb[i][j] = (comb[i - 1][j] + comb[i - 1][j - 1])
(c)
comb[i][j] = (comb[i][j] + comb[i - 1][j - 1]) % MOD
(d)
comb[i][j] = (comb[i][j] + comb[i - 1][j - 1])
(e)
comb[i][j] = (comb[i][j - 1] + comb[i - 1][j - 1]) % MOD
(f)
comb[i][j] = (comb[i][j - 1] + comb[i - 1][j - 1])
延伸題目:
3
在 Ubuntu/Debian Linux 中,可執行 sudo apt install dictionaries-common
以安裝辭典套件,於是可得到 /usr/share/dict/words
檔案,後者包含超過 10 萬個單字/詞:
考慮以下 C 程式 (strsearch.c
) 可從給定的詞典中檢索:
給定測試輸入 (檔名: inputs
) 如下:
測試方式:
預期執行結果:
請補完程式碼。
作答區
P1 = ?
(a)
prev_start + i
(b)
prev_start + i + 1
(c)
i - prev_start
(d)
i - prev_start + 1
P2 = ?
(a)
i
(b)
i + 1
(c)
i - 1
延伸題目: