CI5 3 尋找特殊的最大 最小數

2021-06-16 13:40:46 字數 1170 閱讀 4669

給定乙個整數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次比較,整個...