題目連結:
題目意譯:
撰寫一個函式,可以接收一個無號整數並回傳其二進位表示法中的 1 之數量(也被稱為漢明重量(Hamming Weight))。
注:
注意,某些程式語言像是 Java,並沒有所謂的無號整數型態。在這樣的狀況下,輸入及輸出都會是有號整數,而且應當不會影響你的實作,因為無論將給定字串視作有號或無號皆是同樣的表示法。
在 Java 中,編譯器使用 2 補數來表示有號整數。因此,在範例 3 中,輸入代表有號整數 -3 。
進階:
如果此函式會被呼叫很多次,你會怎麼最佳化它呢?
範例測資:
範例 1:
輸入: 00000000000000000000000000001011
輸出: 3
解釋: 輸入的二元字串 00000000000000000000000000001011 總共有 3 個「1」的位元。
範例 2:
輸入: 00000000000000000000000010000000
輸出: 1
解釋: 輸入的二元字串 00000000000000000000000010000000 總共有 1 個「1」的位元。
範例 3:
輸入: 11111111111111111111111111111101
輸出: 31
解釋: 輸入的二元字串 11111111111111111111111111111101 總共有 31 個「1」的位元。
解題思維:
直接跑過每個位元算固然可以,但是實際上運算量可以壓得更低。
利用
昨天的題目之精神——即位元運算,再加上將位元本身作為答案儲存的地方。詳細的範例看
維基十分足夠,而且條目中列出了不少的相異解法。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。