contributed by < shiang1212
>
這個測驗的目的是計算 input
的平方根(捨去小數),最簡單的方法是從 reslut = 0
開始測驗,測驗 reslut * reslut > input
是否成立,成立的話,此時的 reslut - 1
就是我們要的答案;不成立的話就 reslut++
繼續往上測驗。
與版本一和版本二的概念相似,兩方法的測驗方法如下:
相較於簡單的方法用 reslut++
,這個方法是用 reslut += 2^n
逼近,其中 n = {msb, msb - 1, msb - 2, ..., 1, 0}
,測驗 reslut + 2^n * i + 2^n <= N
是否成立,成立的話就 reslut += 2^n
。每輪測驗完就讓 n--
,直到 n == 0
,以下為範例。
透過不斷對輸入進行右移,計算輸入的 leftmost set bit 位置。
考慮到輸入為 的情況,所以 log
初始成 -1。但也可以改寫成以下:
使用二分搜尋的作法,不斷切半判斷輸入是否大於 並右移 16、8、4、2、1。使用二分搜尋的概念讓該方法可以得到與版本一相同的答案,但運算速度比版本一更快。
相似於版本一,只是反過來計算輸入的 leading zero 個數,反推 leftmost set bit 的位置。
這段程式碼計算 nums
裡任兩個有號整數的漢明距離(Hamming distance),使用兩個 for
迴圈走訪 nums
裡的所有數值,並計算每一種組合的漢明距離。
wiki 中漢明距離的介紹:
兩個等長字符串之間的漢明距離(英語:Hamming distance)是兩個字符串對應位置的不同字符的個數。
程式碼的第 6 行用於計算漢明距離,首先 nums[i]
與 nums[j]
做 XOR 操作可以得到一串由 0 和 1 組成的數列,其中 1 代表兩個數值二進位下對應的 bit 不同,再用 __builtin_popcount
求該數列 bit 為 1 的個數,就可以得到 nums[i]
與 nums[j]
的漢明距離。
了解如何計算兩數值之間的漢明距離後,只要將所有組合的漢明距離加總就能達到該題的要求。但該程式碼在累加的時候會重複計算,舉例來說,在計算 num_1
與 num_2
之間的漢明距離時,程式碼會額外多累加一次 (即hamming_distance(num_1, num_2)
與 hamming_distance(num_2, num_1)
),所以最後要再除以 2,也就是右移 1,所以 AAAA = 1
。