Najdłuższe kolejne jedynki w reprezentacji binarnej

Podany numer N Zadanie polega na znalezieniu długości najdłuższego kolejnego 1s szereg w jego binarnej reprezentacji.
Przykłady:  

Wejście: n = 14
Wyjście: 3
Wyjaśnienie: Binarna reprezentacja liczby 14 to 111 0.

Wejście: n = 222
Wyjście: 4
Wyjaśnienie:  Binarna reprezentacja liczby 222 to 110 1111 0.

Spis treści

[Podejście naiwne] Iteracyjny czas O(1) i przestrzeń 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  ));   

Wyjście
3  

[Efektywne podejście] Używanie manipulacji bitami O(1) czasu i O(1) przestrzeni

Pomysł opiera się na koncepcji, że I sekwencji bitów z a w lewo przesunięty o 1 wersja sama w sobie skutecznie usuwa końcówkę 1 z każdej sekwencji następującej po sobie 1s .  

Zatem operacja N = (n & (n < < 1)) zmniejsza długość każdej sekwencji 1s przez jeden w reprezentacji binarnej N . Jeśli będziemy kontynuować tę operację w pętli, skończymy N = 0. Liczba iteracji wymaganych do osiągnięcia jest w rzeczywistości długością najdłuższego kolejnego ciągu 1s .

Ilustracja:


Wykonaj poniższe kroki, aby wdrożyć powyższe podejście:

  • Utwórz liczbę zmiennych zainicjowaną wartością .
  • Uruchom pętlę while do N nie jest 0.
    • W każdej iteracji wykonaj operację N = (n & (n < < 1))
    • Zwiększ liczbę o jeden.
  • Liczba zwrotów
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  '  ;   ?>   

Wyjście
3  

Złożoność czasowa: O(1)
Przestrzeń pomocnicza: O(1)

[Inne podejście] Korzystanie z konwersji ciągów

Inicjujemy dwie zmienne max_len i cur_len na 0. Następnie iterujemy przez każdy bit liczby całkowitej n. Jeśli najmniej znaczący bit (LSB) wynosi 1, zwiększamy cur_len, aby zliczyć bieżący przebieg kolejnych jedynek. Jeśli LSB wynosi 0, przerywa bieżącą sekwencję, więc aktualizujemy max_len, jeśli cur_len jest większy i resetujemy cur_len do 0. Po sprawdzeniu każdego bitu przesuwamy n w prawo o 1, aby przejść do następnego bitu. Na koniec, po zakończeniu pętli, wykonujemy ostatnią aktualizację max_len, jeśli końcowa wartość cur_len jest większa i zwracamy max_len jako długość najdłuższej sekwencji kolejnych jedynek.

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  ));   

Wyjście
3  


 

Utwórz quiz