給定乙個整數n,輸出小於n的最大整數max和大於n的最小整數min,且n、max、min這三個數的二進位制表示中1的個數相等。
思路:最大整數max:從最低位開始找到第乙個為0的位,記為bit0;從bit0位開始繼續,找到第乙個為1的位,記為bit1。將bit1置為0,然後將[0, bit1)區間的位清零,得到的整數記為temp。此時temp和n中的bit1到最高位的值相同,然後計算temp和n的二進位制中1的個數差值count,最後將temp的(bit1, 0]區間的最高count位置為1,得到的結果就是max。
最小正數min:從最低位開始找到第乙個為1的位,記為bit1;從bit1為開始繼續,找到第乙個為0的位,記為bit0,將bit0置為1,然後將[0, bit0)區間的位清零,得到的整數記為temp。此時temp和n中的bit0到最高位的值相同,然後計算temp和n的二進位制中1的個數差值count,最後將temp的最低count位置為1,得到的結果就是min。
#include using namespace std;
int countone(int num)
return res;
}int minoflarger(int num)
while ((temp & 1) == 1 && bit < 32)
if (bit == 32)
return -1;
temp |= 1;
temp <<= bit;
int count = countone(num) - countone(temp);
int mask = 1;
for (int i = 0; i < count; ++i)
return temp;
}int maxofsmaller(int num)
while ((temp & 1) == 0 && bit < 32)
if (bit == 32)
return -1;
temp &= (~1);
temp <<= bit;
int count = countone(num) - countone(temp);
for (int i = 1; i <= count; ++i)
return temp;
}int main()
return 0;
}
同時尋找最大數和最小數的最優演算法
我們知道,在乙個容量為n的資料集合中尋找乙個最大數,不管用什麼樣的比較演算法,至少要比較n 1次,就算是用競標賽排序也得比較n 1次,否則你找到的就不能保證是最大的數。那麼,在乙個容量為n的資料集合中同時尋找最大數和最小數的最小比較次數是多少呢?從乙個容量為n的資料集合中同時找到最大數和最小數的最優...
尋找乙個陣列中的最大和最小數
有乙個求陣列中最大和最小數的題目,基本的思路是遍歷一遍陣列,然後每個乙個元素都和最大值和最小值比較,時間複雜度是2 n 1 或2n。比較簡單的一種減少複雜度的方法是把陣列的元素兩兩分組比較,然後較大的數和max比較,較小的數和min比較,這種實現方法的時間複雜度是1.5n。還有一種是採用分治法,比較...
同時尋找序列的最大最小值
問題描述 給定乙個長度為n n 2 的無序正整數序列ary,要求同時找到其中最大和最小值元素,並返回其和。分析 將最大值max和最小值min看成一對 mix,min 每次從序列中成對地取出兩個元素,將其中較小者與min比較並更新,將其中較大者與max必將並更新,這樣處理每一對元素只需要3次比較,整個...