عكس صفيف في مجموعات ذات حجم معين

عكس صفيف في مجموعات ذات حجم معين
جربه على ممارسة GfG

نظرا لمجموعة وصول[] وعدد صحيح ك ابحث عن المصفوفة بعد عكس كل مصفوفة فرعية من عناصر k المتتالية في مكانها. إذا كانت المصفوفة الفرعية الأخيرة تحتوي على أقل من عناصر k، قم بعكسها كما هي. تعديل المصفوفة في مكانها لا يعود بأي شيء.

أمثلة:  

مدخل: آر[] = [1 2 3 4 5 6 7 8] ك = 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].

مدخل: آر[] = [1 2 3 4 5] ك = 3
الإخراج: [3 2 1 5 4]
شرح: المجموعة الأولى تتكون من العناصر 1 2 3. المجموعة الثانية تتكون من 4 5.

أنا نبوت: آر[] = [5 6 8 9] ك = 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) يتم الانعكاس مباشرة داخل المصفوفة الأصلية باستخدام عدد قليل من المتغيرات الإضافية.