Leetcode :面试题 05.04. 下一个数(位运算)

下一个数。给定一个正整数,找出与其二进制表达式中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};

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值