牛客劍指OFFER JZ11 二進位制中1的個數

2021-10-09 07:47:07 字數 1342 閱讀 4979

題目描述

輸入乙個整數,輸出該數32位二進位制表示中1的個數。其中負數用補碼表示。

思路一:

1、對於任意乙個32位二進位制表示的數n,現取n = ******01100 為例子,顯然 n-1 = ******01011,則 n&(n-1) = ******01000;

2、上述例子想說的是,n&(n-1) 這一式子得到的是 n 的最低位的 1 變為 0 後的值。

3、令 n 為迴圈進行條件, n = n&(n-1),當迴圈結束時,迴圈進行的次數就是 1 的總數。

int

numberof1

(int n)

return cnt;

}

思路二: 這是在一道題目中看到做法。

1、對於某個二進位制數,如 n = 1011,取 n = n&(0x5) +((n>>1) & 0x5) = 0001 + 0101 = 0110;

(1)這個算式的意義是將n的相鄰的兩位相加,得到的結果也以二進位制形式記錄下來。

(2)由於二進位制不是0就是1,所以得到的結果中,每相鄰的兩位組成的數值都代表著原先的n在這個位置上1的數量。

(3)例如上式的結果 0110,代表 n 的第1和第2位上( 11 部分)1的數量為 10 = 2;第3和第4位上( 10 部分)1的數量為 01 = 1。

(4)最好自己算一算,看看結果是怎麼來的。

2、對於上式結果 n = 0110,取 n = n&(0x3) +((n>>2) & 0x3) = 0010 + 0001 = 0011;

(1)這個算式的意義是將n的相鄰的兩位一組,然後相鄰的兩組相加,得到的結果也以二進位制形式記錄下來

(2)由於 0110 中每相鄰的兩位組成的數值都代表著原先的n在這個位置上1的數量,所以得到的結果中,每相鄰的四位組成的數值都代表著原先的n在這個位置上1的數量。

(3)例如上式的結果 0011,代表 n 的第1、第2、第3和第4位上( 整個 1011) 1的數量為 0011 = 3。

由於 1011 本身也只有四位,所以到這裡就算好了,但對於 32 位的數還需要 相鄰的四位一組,然後相鄰的兩組相加、八位、直到十六位

**中的 int n = n1 & 0x7fffffff;主要是針對負數,將符號位的 1 改為 0 ,最後輸出時還要+1。

但在編譯器上跑,不用這一段也能出正確結果,也就是說不用考慮負數,但牛客上面會出錯…原因不明。

int

numberof1

(int n1)

牛客劍指OFFER JZ2 替換空格

題目描述 思路1 從頭開始 1 新建乙個陣列p,從頭開始遍歷原陣列str 2 若str中某位置資料不為空格,則p中對應位置改為該資料 3 若str中某位置資料為空格,則p中對應位置改為 20,可用strcat代勞 4 最後把p中內容拷到str中,用strcpy 優點 簡單好想。void replac...

牛客劍指OFFER JZ15 反轉鍊錶

題目描述 輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭。思路 1 如果鍊錶為空,返回 2 定義兩個節點指標pl phead pr phead next 3 令 pl next null 鍊錶反轉後的結尾 4 每一次迴圈,令 phead pr phead指向準備改變節點內指標指向的節點pr pr pr ...

牛客劍指OFFER JZ6 用兩個棧實現佇列

題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列rotatearray的最小元素。例如陣列 3,4,5,1,2 為 1,2,3,4,5 的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回...