最近想刷一下LeetCode練習一下數據結構算法之類的,先從水題開始吧
題目是這樣的
Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also known as the Hamming weight).
For example, the 32-bit integer ’11' has binary representation 00000000000000000000000000001011
, so the function should return 3.
大概就是32位整形數計算其中1的個數也就是漢明碼重,因為最近正在復習C方面的基礎知識,看了一本 C和指針 在操作符那一章裡面有關於位運算的講解,其中就是拿這個題目來講解的,經典果然是經典啊!由此也可以看出,一些大公司的筆試面試題也喜歡從這些經典的書籍裡面找原題或者思路
下面就給出Solution:
1 class Solution { 2 public: 3 int hammingWeight(uint32_t n) { 4 int ones=0; 5 for(;n!=0;n>>=1){ 6 if((n&1)!=0){ 7 ones++; 8 } 9 } 10 return ones; 11 } 12 };
簡單來說是一個循環,循環判斷當前的數字中是否還有1
值得說明的是(1)n&1 判斷最低位 如果是0 n>>=1 如果是1 ones加一表示1的位數加一
(2)n>>=1 這是一個右移操作,我們來回顧一下移位操作
首先是 左移操作
左移操作向左移出n位後尾部空缺位用0補足
其次是 右移操作
右移操作又分為邏輯右移和算術右移兩者是有區別的:邏輯右移與左移操作類似,只是向右移出n位後左邊的空缺位由0補足;算術右移的話右移n位後高位的空缺位需要用符號位補足,如果是負數就補足1如果是正數就補足0
而到底是什麼右移方式是由你的編譯器來決定的
當然這道題還有一點小變動:
1 class Solution { 2 public: 3 int hammingWeight(uint32_t n) { 4 int ones=0; 5 for(;n!=0;n>>=1){ 6 if((n%2)!=0){ 7 ones++; 8 } 9 } 10 return ones; 11 } 12 };
只是將條件判斷改成了(n%2)!=0 效果是相同的都是判斷當前為是否為1
順便吐槽下,java運行有這麼慢?我不信