주어진 크기의 그룹으로 배열을 뒤집습니다.

주어진 크기의 그룹으로 배열을 뒤집습니다.
GfG Practice에서 사용해 보세요.

배열이 주어지면 도착[] 그리고 정수 케이 연속된 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로 구성됩니다.

입력: 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) 반전은 몇 가지 추가 변수를 사용하여 원래 배열 내에서 직접 수행됩니다.