題目:統計給定數字中,值為1的二進位制位的數量。如果是陣列呢?
int getbitcount(unsigned int
num)
return count;
}
第一種想法比較簡單,從最後一位開始,比較是否為1,如果為1,就計數器加一。迴圈次數固定,32次。但是這種方法有乙個地方需要注意,那就形參必須為unsigned int
。否則,如果num為負數時,此時右移為了保證移位後還是負數,最高位會一直置為1,那將陷入死迴圈。
int getbitcount2(unsigned int
num)
return count;
}
相比較第一種演算法,我們不必每次判斷一位,而是通過num & (num-1)
來判斷。每次&
之後,可以把num最低位的1置為0,那麼迴圈的次數,也就降低到了所含1的個數。
static const unsigned char bitsinbyte[256] = ;
int getbitcount3(unsigned int num)
通過定義乙個bitsinbyte[256]
位元組陣列,裡面存放0000 0000 - 1111 1111
不同數字的1的個數。然後把需要統計的數字劃分為四段,然後分部計算。
unsigned int getbitcount4(unsigned int
num)
這種演算法也常被稱為漢明重量(hamming weight)
,通過一系列的位移和位運算操作,可以在常數時間內計算多個位元組的漢明重量,而且不需要使用額外的記憶體。接下來分析以下這個演算法。
為了方便描述,我們假定乙個位元組0xd8 ->(二進位制) 0b11011000
從後往前,依次為1到8位,第一位為0,第八位為1。
magic.png
演算法(ms)/資料級別
1010^2
10^3
10^4
10^5
10^6
10^7
10^8遍歷0
01226
2552700
29447
遍歷(改進)00
01774
7398046查表0
0002
21202
2166
swar00
00219
1901876
以上是模擬不同的資料級別,執行測試的結果。
解一道簡單的演算法題
原題是這樣的 乙個未排序整數陣列,有正負數,重新排列使負數排在正數前面,並且要求不改變原來的正負數之間相對順序。比如 input 1,7,5,9,12,15 ans 5,12,1,7,9,15 且要求時間複雜度o n 空間o 1 我實現的解法 解法1 不考慮時間和空間複雜度 則每次找到乙個正數,取出...
一道簡單的題
阿里巴巴的一道面試題 25.給定乙個整數陣列和乙個整數,返回兩個陣列的索引,這兩個索引指向的數字的加和等於指定的整數。需要最優的演算法,分析演算法的空間和時間複雜度。include include using namespace std struct stwoindex 初始化,同時等於0,說明不存...
一道演算法題
兩個燒杯,乙個放糖乙個放鹽,用勺子舀一勺糖到鹽,攪拌均勻,然後舀一勺混合 物會放糖的燒杯,問你兩個燒杯哪個雜質多?一樣多吧 對的 為啥?是不是因為 糖和鹽本來就是均勻的 因為,就算不攪拌均,你放一勺過去,那邊放一勺不含雜質的過來,那麼都是一勺雜之 如果攪拌均勻的話也是一樣 小依 21 45 32 也...