在C ++中一键查找二进制表示形式的最长1序列

假设我们有一个整数n。在其中,我们可以进行一位翻转以生成最长的1s序列。假设数字为13,因此二进制表示形式为1101。如果将1翻转为make 0到1,则它将为1111。这是最长的1s序列

为了解决这个问题,我们将遍历给定数字的位。我们将跟踪当前1的序列长度和前一个1的序列长度。找到零后,再更新以前的长度。因此,如果下一位为1,则应将前一个长度设置为当前长度。如果下一个为0,则将上一个再次设为0。

示例

#include<iostream>
using namespace std;
int singleFlipMaxOnes(unsigned number) {
   if (~number == 0)
      return 8*sizeof(int);
   int curr = 0, prev = 0, max_size = 0;
   while (number!= 0) {
      if ((number & 1) == 1)
         curr++;
      else if ((number & 1) == 0) {
         prev = (number & 2) == 0? 0 : curr;
         curr = 0;
      }
      max_size = max(prev + curr, max_size);
      number >>= 1;
   }
   return max_size+1;
}
int main() {
   cout << "Maximum length of the sequence with 1s: " << singleFlipMaxOnes(13);
}

输出结果

Maximum length of the sequence with 1s: 4