Najdlhšie po sebe idúce 1s v binárnej reprezentácii

Dané číslo n Úlohou je nájsť dĺžku najdlhšieho po sebe idúceho 1 s séria vo svojej binárnej reprezentácii.
Príklady:  

Vstup: n = 14
výstup: 3
Vysvetlenie: Binárne znázornenie 14 je 111 0.

Vstup: n = 222
výstup: 4
Vysvetlenie:  Binárne zobrazenie 222 je 110 1111 0.

Obsah

[Naivný prístup] Iteračný čas O(1) a priestor O(1)

C++
   #include          using     namespace     std  ;   int     maxConsecutiveOne  (  int     n     ){          int     count     =     0     ;      int     maxi     =     0     ;      // traverse and check if bit set increment the count      for     (  int     i     =     0     ;     i      <     32     ;     i  ++  ){      if     (  n     &     (  1      < <     i  )){      count  ++  ;      }     else     {      maxi     =     max     (  maxi          count  );      count     =     0     ;      }      }      return     maxi  ;   }   int     main  ()     {      int     n     =     14     ;      cout      < <     maxConsecutiveOne  (  n  )      < <  'n'  ;      return     0  ;   }   
Java
   public     class   GFG     {      static     int     maxConsecutiveOne  (  int     n  )     {      int     count     =     0  ;      int     maxi     =     0  ;      // traverse and check if bit set increment the count      for     (  int     i     =     0  ;     i      <     32  ;     i  ++  )     {      if     ((  n     &     (  1      < <     i  ))     !=     0  )     {      count  ++  ;      }     else     {      maxi     =     Math  .  max  (  maxi       count  );      count     =     0  ;      }      }      return     maxi  ;      }      public     static     void     main  (  String  []     args  )     {      int     n     =     14  ;      System  .  out  .  println  (  maxConsecutiveOne  (  n  ));      }   }   
Python
   def   maxConsecutiveOne  (  n  ):   count   =   0   maxi   =   0   # traverse and check if bit set increment the count   for   i   in   range  (  32  ):   if   n   &   (  1    < <   i  ):   count   +=   1   else  :   maxi   =   max  (  maxi     count  )   count   =   0   return   maxi   if   __name__   ==   '__main__'  :   n   =   14   print  (  maxConsecutiveOne  (  n  ))   
C#
   using     System  ;   class     GFG   {      static     int     MaxConsecutiveOne  (  int     n  )      {      int     count     =     0  ;      int     maxi     =     0  ;      // traverse and check if bit set increment the count      for     (  int     i     =     0  ;     i      <     32  ;     i  ++  )      {      if     ((  n     &     (  1      < <     i  ))     !=     0  )      {      count  ++  ;      }      else      {      maxi     =     Math  .  Max  (  maxi       count  );      count     =     0  ;      }      }      return     maxi  ;      }      static     void     Main  ()      {      int     n     =     14  ;      Console  .  WriteLine  (  MaxConsecutiveOne  (  n  ));      }   }   
JavaScript
   function     maxConsecutiveOne  (  n  )     {      let     count     =     0  ;      let     maxi     =     0  ;      // traverse and check if bit set increment the count      for     (  let     i     =     0  ;     i      <     32  ;     i  ++  )     {      if     (  n     &     (  1      < <     i  ))     {      count  ++  ;      }     else     {      maxi     =     Math  .  max  (  maxi       count  );      count     =     0  ;      }      }      return     maxi  ;   }   // Driver code   let     n     =     14  ;   console  .  log  (  maxConsecutiveOne  (  n  ));   

Výstup
3  

[Efektívny prístup] Použitie bitovej manipulácie O(1) Čas a O(1) Priestor

Myšlienka je založená na koncepte, že A bitovej sekvencie s a vľavo posunuté o 1 verzia sama o sebe účinne odstraňuje koncové 1 z každej po sebe idúcej sekvencie 1 s .  

Takže operácia n = (n & (n < < 1)) znižuje dĺžku každej sekvencie 1 s o jeden v binárnom vyjadrení n . Ak budeme pokračovať v tejto operácii v slučke, skončíme s n = 0. Počet iterácií potrebných na dosiahnutie je vlastne dĺžka najdlhšej po sebe idúcej sekvencie 1 s .

Ilustrácia:


Pri implementácii vyššie uvedeného prístupu postupujte podľa nasledujúcich krokov:

  • Vytvorte počet premenných inicializovaný hodnotou .
  • Spustite chvíľu cyklu, kým n nie je 0.
    • V každej iterácii vykonajte operáciu n = (n & (n < < 1))
    • Zvýšte počet o jednu.
  • Počet návratov
C++
   #include       using     namespace     std  ;   int     maxConsecutiveOnes  (  int     x  )   {      // Initialize result      int     count     =     0  ;      // Count the number of iterations to      // reach x = 0.      while     (  x  !=  0  )      {      // This operation reduces length      // of every sequence of 1s by one.      x     =     (  x     &     (  x      < <     1  ));      count  ++  ;      }      return     count  ;   }   int     main  ()   {      // Function Call      cout      < <     maxConsecutiveOnes  (  14  )      < <     endl  ;      return     0  ;   }   
Java
   class   GFG   {      private     static     int     maxConsecutiveOnes  (  int     x  )      {      // Initialize result      int     count     =     0  ;      // Count the number of iterations to      // reach x = 0.      while     (  x  !=  0  )      {      // This operation reduces length      // of every sequence of 1s by one.      x     =     (  x     &     (  x      < <     1  ));      count  ++  ;      }      return     count  ;      }      public     static     void     main  (  String     strings  []  )      {      System  .  out  .  println  (  maxConsecutiveOnes  (  14  ));      }   }   
Python
   def   maxConsecutiveOnes  (  x  ):   # Initialize result   count   =   0   # Count the number of iterations to   # reach x = 0.   while   (  x  !=  0  ):   # This operation reduces length   # of every sequence of 1s by one.   x   =   (  x   &   (  x    < <   1  ))   count  =  count  +  1   return   count   if   __name__   ==   '__main__'  :   print  (  maxConsecutiveOnes  (  14  ))   # by Anant Agarwal.   
C#
   using     System  ;   class     GFG     {          // Function to find length of the       // longest consecutive 1s in binary      // representation of a number       private     static     int     maxConsecutiveOnes  (  int     x  )      {          // Initialize result      int     count     =     0  ;      // Count the number of iterations      // to reach x = 0.      while     (  x     !=     0  )      {          // This operation reduces length      // of every sequence of 1s by one.      x     =     (  x     &     (  x      < <     1  ));      count  ++  ;      }      return     count  ;      }      // Driver code      public     static     void     Main  ()      {      Console  .  WriteLine  (  maxConsecutiveOnes  (  14  ));      }   }   // This code is contributed by Nitin Mittal.   
JavaScript
   function     maxConsecutiveOnes  (  x  )     {      // Initialize result      let     count     =     0  ;      // Count the number of iterations to reach x = 0      while     (  x     !==     0  )     {          // This operation reduces length of       // every sequence of 1s by one      x     =     (  x     &     (  x      < <     1  ));      count  ++  ;      }      return     count  ;   }   // Driver code   console  .  log  (  maxConsecutiveOnes  (  14  ));   
PHP
      // PHP program to find length    function   maxConsecutiveOnes  (  $n  )   {   // Initialize result   $count   =   0  ;   // Count the number of    // iterations to reach x = 0.   while   (  $n   !=   0  )   {   // This operation reduces    // length of every sequence   // of 1s by one.   $n   =   (  $n   &   (  $n    < <   1  ));   $count  ++  ;   }   return   $count  ;   }   echo   maxConsecutiveOnes  (  14  )   '  n  '  ;   ?>   

Výstup
3  

Časová zložitosť: O(1)
Pomocný priestor: O(1)

[Iný prístup] Použitie konverzie reťazcov

Inicializujeme dve premenné max_len a cur_len na 0. Potom iterujeme cez každý bit celého čísla n. Ak je najnižší významný bit (LSB) 1, zvýšime hodnotu cur_len, aby sa počítal aktuálny priebeh po sebe idúcich 1s. Ak je LSB 0, preruší sa aktuálna sekvencia, takže aktualizujeme max_len, ak je cur_len väčší a nastavíme cur_len na 0. Po skontrolovaní každého bitu posunieme n o 1 doprava, aby sme sa presunuli na ďalší bit. Nakoniec po skončení cyklu vykonáme poslednú aktualizáciu max_len, ak je konečný cur_len väčší a vrátime max_len ako dĺžku najdlhšej sekvencie po sebe idúcich 1s.

C++
   #include          #include          #include         using     namespace     std  ;   int     maxConsecutiveOnes  (  int     n  ){      string     binary     =     bitset   <  32  >  (  n  ).  to_string  ();      int     count     =     0  ;      int     maxCount     =     0  ;      // Loop through the binary string to      // find the longest consecutive 1s      for     (  int     i     =     0  ;     i      <     binary  .  size  ();     i  ++  )     {      if     (  binary  [  i  ]     ==     '1'  )     {      count  ++  ;      if     (  count     >     maxCount  )     {      maxCount     =     count  ;      }      }     else     {      count     =     0  ;      }      }      // Print the result      return     maxCount     ;       }   int     main  ()     {      int     n     =     14  ;      cout      < <     maxConsecutiveOnes  (  n  )      < <  'n'  ;      return     0  ;   }   
Java
   import     java.util.*  ;   public     class   Main     {      static     int     maxConsecutiveOnes  (  int     n  )     {      String     binary     =     String  .  format  (  '%32s'       Integer  .  toBinaryString  (  n  )).  replace  (  ' '       '0'  );      int     count     =     0  ;      int     maxCount     =     0  ;      // Loop through the binary string to      // find the longest consecutive 1s      for     (  int     i     =     0  ;     i      <     binary  .  length  ();     i  ++  )     {      if     (  binary  .  charAt  (  i  )     ==     '1'  )     {      count  ++  ;      if     (  count     >     maxCount  )     {      maxCount     =     count  ;      }      }     else     {      count     =     0  ;      }      }      // Return the result      return     maxCount  ;      }      public     static     void     main  (  String  []     args  )     {      int     n     =     14  ;      System  .  out  .  println  (  maxConsecutiveOnes  (  n  ));      }   }   
Python
   def   maxConsecutiveOnes  (  n  ):   binary   =   format  (  n     '032b'  )   count   =   0   maxCount   =   0   # Loop through the binary string to   # find the longest consecutive 1s   for   bit   in   binary  :   if   bit   ==   '1'  :   count   +=   1   if   count   >   maxCount  :   maxCount   =   count   else  :   count   =   0   # Return the result   return   maxCount   if   __name__   ==   '__main__'  :   n   =   14   print  (  maxConsecutiveOnes  (  n  ))   
C#
   using     System  ;   class     GFG   {      static     int     MaxConsecutiveOnes  (  int     n  )      {      string     binary     =     Convert  .  ToString  (  n       2  ).  PadLeft  (  32       '0'  );      int     count     =     0  ;      int     maxCount     =     0  ;      // Loop through the binary string to      // find the longest consecutive 1s      foreach     (  char     bit     in     binary  )      {      if     (  bit     ==     '1'  )      {      count  ++  ;      if     (  count     >     maxCount  )      maxCount     =     count  ;      }      else      {      count     =     0  ;      }      }      // Return the result      return     maxCount  ;      }      static     void     Main  ()      {      int     n     =     14  ;      Console  .  WriteLine  (  MaxConsecutiveOnes  (  n  ));      }   }   
JavaScript
   function     maxConsecutiveOnes  (  n  )     {      let     binary     =     n  .  toString  (  2  ).  padStart  (  32       '0'  );      let     count     =     0  ;      let     maxCount     =     0  ;      // Loop through the binary string to      // find the longest consecutive 1s      for     (  let     i     =     0  ;     i      <     binary  .  length  ;     i  ++  )     {      if     (  binary  [  i  ]     ===     '1'  )     {      count  ++  ;      if     (  count     >     maxCount  )     {      maxCount     =     count  ;      }      }     else     {      count     =     0  ;      }      }      // Return the result      return     maxCount  ;   }   // Driver code   let     n     =     14  ;   console  .  log  (  maxConsecutiveOnes  (  n  ));   

Výstup
3  


 

Vytvoriť kvíz