下一个数。给定一个正整数,找出与其二进制表达式中1的个数相同且大小最接近的那两个数(一个略大,一个略小)。
示例1:
输入:num = 2(或者0b10)
输出:[4, 1] 或者([0b100, 0b1])
示例2:
输入:num = 1
输出:[2, -1]
提示:
num的范围在[1, 2147483647]之间;
如果找不到前一个或者后一个满足条件的正数,那么输出 -1。
找一个大一点的数,在二进制中从右到左,找到01,变为10,后面的1全部放到右边,
找一个小一点的数,在二进制中从右到左,找到10,变为01,后面的1全部放到左边
关于bitset
http://www.cplusplus.com/reference/bitset/bitset/
class Solution {
public:
vector<int> findClosedNumbers(int num) {
bitset<32> small(num);
bitset<32> bigger(num);
int s=-1;
for(int i=1;i<32;i++){
if(small[i]==1&&small[i-1]==0){
small.flip(i);
small.flip(i-1);
for(int left=0,right=i-2;left<right;){
while(left<right&&small[left]==0) left++;
while(left<right&&small[right]==1) right--;
small.flip(left);
small.flip(right);
}
s=(int)small.to_ulong();
break;
}
}
int b=-1;
for(int i=1;i<32;i++){
if(bigger[i]==0&&bigger[i-1]==1){
bigger.flip(i);
bigger.flip(i-1);
for(int left=0,right=i-2;left<right;){
while(left<right&&bigger[left]==1) left++;
while(left<right&&bigger[right]==0) right--;
bigger.flip(left);
bigger.flip(right);
}
b=(int)bigger.to_ulong();
break;
}
}
return {b,s};
}
};