在C++中查詢二進位制表示中透過一次翻轉可獲得的最長1序列


假設我們有一個整數n。在其中,我們可以進行一位翻轉以生成最長的1序列。假設數字是13,則二進位制表示為1101。如果我們進行一位翻轉,將0變為1,它將變為1111。這是最長的1序列。

為了解決這個問題,我們將遍歷給定數字的位。我們將跟蹤當前的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

更新於:2019年12月19日

瀏覽量1K+

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.