contributed by < grb72t3yde
>
sysprog2020
1
LeetCode 461. Hamming Distance 提及,兩個整數間的 Hamming distance 為其二進位的每個位元的差。請計算輸入參數兩整數 x 與 y 的 Hamming distance,例如整數 1
的二進位為 0 0 0 1
,而整數 4
的二進位為 0 1 0 0
,則 1
與 4
的 Hamming distance 為 2
。
運用第 3 周測驗 提到的 __builtin_popcount
(gcc extension 之一),我們可實作如下:
參考資訊:
OP = ?
__builtin_popcount
, 因此直觀地使用 XOR
來使得兩個輸入 x, y 相同的 bit 結果為 0
, 而不同的 bit 為 1
naive.c
), runtime 目前為 48ms
(better than 35%), 待改進0
, 1
的個數方式, 以空間換取時間以避免 TLE或許試著找出減少 branch
的方法
2
TODO
3
白板 coding 其實本意 (最好不要是) 不是考一些你已經會的東西,而是考一個你可能不會的問題,然後你要 keep trying, keep doing 下去,因為它的本質是在考一個未來你可能碰到的問題 (而且可能 Google 不到)。
出處: 簡單的 FizzBuzz 藏有深度 (Google 面試題)
考慮貌似簡單卻蘊含實作深度的 FizzBuzz 題目:
直覺的實作程式碼如下: (naive.c
)
觀察 printf
的(格式)字串,可分類為以下三種:
"%d"
: 長度為 2 B考慮下方程式碼:
我們若能精準從給定輸入 i
的規律去控制 start
及 length
,即可符合 FizzBuzz 題意:
以下是利用 bitwise 和上述技巧實作的 FizzBuzz 程式碼: (bitwise.c
)
gcc-9 還內建了 FizzBuzz optimization (Bug 82853 - Optimize x % 3 == 0 without modulo)。
KK1 = ?
div3
, div5
分別表示整數 i
能否被 3
, 5
整除start
複製 "FizzBuzz%u" 字串, 可以判斷用 MSG_LEN
進行左移兩次的數值 KK1
與 (KK2 << KK3)
個別在處理 能被 5
整除 以及 能被 3
整除的情況i
是 3
的倍數或是 15
的倍數時, 都應該從 [0] 處開始複製, KK1
應為 div5
(否則沒有其他判斷 div5
處)KK2 = ? KK3 = ?
i
為 3
之倍數, 應該從 [0] 處開始複製, 此時 (KK2 << KK3)
必須為 3
以上的值i
不為 3
的倍數時, 只能透過 KK2
= div3
且 KK3
= 2
來控制此種條件