הפוך מערך בקבוצות בגודל נתון

הפוך מערך בקבוצות בגודל נתון
נסה את זה ב-GfG Practice

נתון מערך arr[] ומספר שלם ק מצא את המערך לאחר היפוך של כל תת-מערך של k אלמנטים עוקבים במקום. אם במערך המשנה האחרון יש פחות מ-k אלמנטים, הפוך אותו כפי שהוא. שנה את המערך במקום אל תחזיר כלום.

דוגמאות:  

קֶלֶט: arr[] = [1 2 3 4 5 6 7 8] k = 3
תְפוּקָה: [3 2 1 6 5 4 8 7]
הֶסבֵּר: אלמנטים הפוכים: [1 2 3] → [3 2 1] [4 5 6] → [6 5 4] והקבוצה האחרונה [7 8](גודל < 3) is reversed as [8 7].

קֶלֶט: arr[] = [1 2 3 4 5] k = 3
פלט: [3 2 1 5 4]
הסבר: הקבוצה הראשונה מורכבת מאלמנטים 1 2 3. הקבוצה השנייה מורכבת מ-4 5.

אֲנִי nput: arr[] = [5 6 8 9] k = 5
תְפוּקָה: [9 8 6 5]
הֶסבֵּר: מכיוון ש-k גדול מגודל המערך, המערך כולו הפוך.

[גִישָׁה ] היפוך קבוצה בגודל קבוע

הרעיון הוא לשקול כל תת-מערך בגודל k החל מתחילת המערך ולהפוך אותו. אנחנו צריכים לטפל בכמה מקרים מיוחדים. 
=> אם k אינו כפולה של n כאשר n הוא גודל המערך עבור הקבוצה האחרונה יישארו לנו פחות מ-k אלמנטים עלינו להפוך את כל האלמנטים הנותרים. 
=> אם k = 1 המערך צריך להישאר ללא שינוי. אם k >= n נהפוך את כל האלמנטים הקיימים במערך.

כדי להפוך תת-מערך לשמור על שני מצביעים: שמאל וימין. כעת החליפו את הרכיבים במצביעים שמאלה וימינה והגדלו שמאלה ב-1 והקטנו ימינה ב-1. חזור עד שמצביעים ימינה ושמאלה לא יחצו זה את זה.

עובד:

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

תְפוּקָה
3 2 1 6 5 4 8 7  

מורכבות זמן: O(n) אנחנו עוברים על כל המערך רק פעם אחת והופכים אלמנטים בקבוצות בגודל k. מכיוון שאיננו חוזרים על אף אלמנט, סך כל העבודה שבוצעה גדל באופן ליניארי עם גודל המערך. אז אם למערך יש n אלמנטים הוא לוקח בערך n צעדים.
מרחב עזר: O(1) ההיפוך נעשה ישירות בתוך המערך המקורי תוך שימוש בכמה משתנים נוספים בלבד.