為了加強自己的程式能力,會記錄刷leetcode的解法+說明,這次也會用Ruby
、python
和JavaScript
三個語言來解題,讓我們開始吧!
題目來源:leetcode
漢明權重
此題提到了個特別的詞:漢明權重,維基百科中解釋,漢明權重是一串符號中非零符號的個數。因此它等同於同樣長度的全零符號串的漢明距離。在最為常見的數據位符號串中,它是1的個數。
漢明權重(Hamming weight)是以理察·衛斯里·漢明(Richard Wesley Hamming)的名字命名的,它在包括資訊理論、編碼理論、密碼學等多個領域都有應用。
而這題的解法,就是將輸入的數字轉為二進位制的字串,接著計算1
的數量即可。
Ruby
1 2 3 4 5 6 7
| def hamming_weight(n) n.to_s(2).count('1') end
puts hamming_weight(0b00000000000000000000000000001011) puts hamming_weight(0b00000000000000000000000010000000) puts hamming_weight(0b11111111111111111111111111111101)
|
在程式中經常使用0b
開頭表示此為二進位制,而在Ruby中,前面有零的數字會被當作八進制數字解析,所以此題的傳入值前面可以加上0b
,確保最後的結果會是正確的。
Python
1 2 3 4 5 6 7 8 9
| class Solution: def hammingWeight(self, n: int) -> int: return bin(n).count('1')
solution = Solution()
print(solution.hammingWeight(0b00000000000000000000000000001011)) print(solution.hammingWeight(0b00000000000000000000000010000000)) print(solution.hammingWeight(0b11111111111111111111111111111101))
|
Python的bin(x)
將整數轉為帶前綴0b
的二進制字串,因為0b
並不會影響我們最後要計算1
的數量的結果,因此不需要特別轉換。
如果要控制是否顯示前缀0b
,可以使用:
1 2 3 4
| format(14, '#b'), format(14, 'b') ('0b1110', '1110') f'{14:#b}', f'{14:b}' ('0b1110', '1110')
|
來源:Python官方文件
JavaScript
1 2 3 4 5 6 7
| var hammingWeight = function(n) { return n.toString(2).split('1').length - 1; };
console.log(hammingWeight(0b00000000000000000000000000001011)) console.log(hammingWeight(0b00000000000000000000000010000000)) console.log(hammingWeight(0b11111111111111111111111111111101))
|
JS的使用.split('1')
,將字串依據1分割為陣列,最後計算陣列的長度再-1
就可以得到答案了!
為什麼這裡要-1
呢?可以想像一個蛋糕,如果切了一刀會變成兩塊,其中的那一刀,在這裡就是1
的意思,我們最後要得到的是切了幾刀
,而不是蛋糕有幾塊
,所以為了校正最後會需要-1
。
以上就是今天的Leetcode刷題解釋٩(●˙▿˙●)۶
Comments