Kehren Sie ein Array in Gruppen einer bestimmten Größe um

Kehren Sie ein Array in Gruppen einer bestimmten Größe um
Probieren Sie es bei GfG Practice aus

Gegeben ein Array arr[] und eine ganze Zahl k Finden Sie das Array, nachdem Sie jedes Unterarray aus aufeinanderfolgenden k Elementen an der richtigen Stelle umgedreht haben. Wenn das letzte Unterarray weniger als k Elemente hat, wird es so umgedreht, wie es ist. Ändern Sie das Array an Ort und Stelle und geben Sie nichts zurück.

Beispiele:  

Eingang: arr[] = [1 2 3 4 5 6 7 8] k = 3
Ausgabe: [3 2 1 6 5 4 8 7]
Erläuterung: Elemente ist umgekehrt: [1 2 3] → [3 2 1] [4 5 6] → [6 5 4] und die letzte Gruppe [7 8](Größe < 3) is reversed as [8 7].

Eingang: arr[] = [1 2 3 4 5] k = 3
Ausgabe: [3 2 1 5 4]
Erläuterung: Die erste Gruppe besteht aus den Elementen 1 2 3. Die zweite Gruppe besteht aus 4 5.

ICH Eingabe: arr[] = [5 6 8 9] k = 5
Ausgabe: [9 8 6 5]
Erläuterung: Da k größer als die Arraygröße ist, wird das gesamte Array umgekehrt.

[Ansatz ] Gruppenumkehr mit fester Größe

Die Idee besteht darin, jedes Unterarray der Größe k beginnend vom Anfang des Arrays zu betrachten und umzukehren. Wir müssen einige Sonderfälle bearbeiten. 
=> Wenn k kein Vielfaches von n ist, wobei n die Größe des Arrays für die letzte Gruppe ist, bleiben weniger als k Elemente übrig. Wir müssen alle verbleibenden Elemente umkehren. 
=> Wenn k = 1, sollte das Array unverändert bleiben. Wenn k >= n, kehren wir alle im Array vorhandenen Elemente um.

Um ein Subarray umzukehren, behalten Sie zwei Zeiger bei: links und rechts. Vertauschen Sie nun die Elemente am linken und rechten Zeiger und erhöhen Sie den linken Wert um 1 und verringern Sie den rechten Wert um 1. Wiederholen Sie dies, bis sich der linke und der rechte Zeiger nicht mehr kreuzen.

Arbeiten:

C++
   #include          #include         using     namespace     std  ;   void     reverseInGroups  (  vector   <  int  >&     arr       int     k  ){          // Get the size of the array      int     n     =     arr  .  size  ();         for     (  int     i     =     0  ;     i      <     n  ;     i     +=     k  )     {      int     left     =     i  ;      // to handle case when k is not multiple of n      int     right     =     min  (  i     +     k     -     1       n     -     1  );      // reverse the sub-array [left right]      while     (  left      <     right  )     {      swap  (  arr  [  left  ++  ]     arr  [  right  --  ]);      }      }   }   int     main  ()     {          vector   <  int  >     arr     =     {  1       2       3       4       5       6       7       8  };         int     k     =     3  ;         reverseInGroups  (  arr       k  );         for     (  int     num     :     arr  )      cout      < <     num      < <     ' '  ;      return     0  ;   }   
C
   #include         void     reverseInGroups  (  int     arr  []     int     n       int     k  ){          for     (  int     i     =     0  ;     i      <     n  ;     i     +=     k  )     {          int     left     =     i  ;      int     right  ;          // to handle case when k is not multiple      // of n      if  (  i  +  k  -1   <  n  -1  )      right     =     i  +  k  -1  ;      else      right     =     n  -1  ;      // reverse the sub-array [left right]      while     (  left      <     right  )     {      // swap      int     temp     =     arr  [  left  ];      arr  [  left  ]     =     arr  [  right  ];      arr  [  right  ]     =     temp  ;      left  ++  ;      right  --  ;      }      }   }   int     main  ()     {      int     arr  []     =     {  1       2       3       4       5       6       7       8  };      int     k     =     3  ;      int     n     =     sizeof  (  arr  )     /     sizeof  (  arr  [  0  ]);      reverseInGroups  (  arr       n       k  );      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )      printf  (  '%d '    arr  [  i  ]);      return     0  ;   }   
Java
   class   GfG     {      static     void     reverseInGroups  (  int  []     arr       int     k  ){      int     n     =     arr  .  length  ;         for     (  int     i     =     0  ;     i      <     n  ;     i     +=     k  )     {      int     left     =     i  ;      int     right     =     Math  .  min  (  i     +     k     -     1       n     -     1  );         // reverse the sub-array      while     (  left      <     right  )     {      int     temp     =     arr  [  left  ]  ;      arr  [  left  ]     =     arr  [  right  ]  ;      arr  [  right  ]     =     temp  ;      left  ++  ;      right  --  ;      }      }      }          public     static     void     main  (  String  []     args  )     {      int  []     arr     =     {  1       2       3       4       5       6       7       8  };      int     k     =     3  ;      reverseInGroups  (  arr       k  );      for     (  int     num     :     arr  )     {      System  .  out  .  print  (  num     +     ' '  );      }      }   }   
Python
   def   reverseInGroups  (  arr     k  ):   i   =   0   # get the size of the array   n   =   len  (  arr  )   while   i    <   n  :   left   =   i   # To handle case when k is not   # multiple of n   right   =   min  (  i   +   k   -   1     n   -   1  )   # reverse the sub-array [left right]   while   left    <   right  :   arr  [  left  ]   arr  [  right  ]   =   arr  [  right  ]   arr  [  left  ]   left   +=   1   right   -=   1   i   +=   k   if   __name__   ==   '__main__'  :   arr   =   [  1     2     3     4     5     6     7     8  ]   k   =   3   reverseInGroups  (  arr     k  )   print  (  ' '  .  join  (  map  (  str     arr  )))   
C#
   using     System  ;   class     GfG     {      public     static     void     reverseInGroups  (  int  []     arr       int     k  ){          int     n     =     arr  .  Length  ;      for     (  int     i     =     0  ;     i      <     n  ;     i     +=     k  )     {      int     left     =     i  ;      // to handle case when k is      // not multiple of n      int     right     =     Math  .  Min  (  i     +     k     -     1       n     -     1  );      int     temp  ;      // reverse the sub-array [left right]      while     (  left      <     right  )     {      temp     =     arr  [  left  ];      arr  [  left  ]     =     arr  [  right  ];      arr  [  right  ]     =     temp  ;      left     +=     1  ;      right     -=     1  ;      }      }      }      public     static     void     Main  (  string  []     args  ){          int  []     arr     =     new     int  []     {     1       2       3       4       5       6       7       8     };      int     k     =     3  ;      int     n     =     arr  .  Length  ;      reverseInGroups  (  arr       k  );      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      Console  .  Write  (  arr  [  i  ]     +     ' '  );      }      }   }   
JavaScript
   function     reverseInGroups  (  arr       k  )     {          let     n     =     arr  .  length  ;         for     (  let     i     =     0  ;     i      <     n  ;     i     +=     k  )     {      let     left     =     i  ;      // to handle case when k is not      // multiple of n      let     right     =     Math  .  min  (  i     +     k     -     1       n     -     1  );          // reverse the sub-array [left right]      while     (  left      <     right  )     {          // Swap elements      [  arr  [  left  ]     arr  [  right  ]]     =     [  arr  [  right  ]     arr  [  left  ]];      left     +=     1  ;      right     -=     1  ;      }      }      return     arr  ;   }   // Driver Code   let     arr     =     [  1       2       3       4       5       6       7       8  ];   let     k     =     3  ;   let     arr1     =     reverseInGroups  (  arr       k  );   console  .  log  (  arr1  .  join  (  ' '  ));   

Ausgabe
3 2 1 6 5 4 8 7  

Zeitkomplexität: O(n) durchlaufen wir das gesamte Array nur einmal und kehren Elemente in Gruppen der Größe k um. Da wir kein Element erneut aufrufen, wächst die insgesamt geleistete Arbeit linear mit der Größe des Arrays. Wenn das Array also n Elemente hat, sind ungefähr n Schritte erforderlich.
Hilfsraum: O(1) Die Umkehrung erfolgt direkt innerhalb des ursprünglichen Arrays mit nur wenigen zusätzlichen Variablen.