سوال 189

عنوان سوال : Rotate Array

  • متوسط
  • مرتب سازی
  • دو اشاره گر
  • ریاضی

البته، در ادامه ترجمه‌ی کامل و دقیق متن سؤال به فارسی آورده شده است، بدون حذف یا خلاصه‌سازی:

سؤال:
یک آرایه‌ی عدد صحیح به نام nums داده شده است. آرایه را به سمت راست به اندازه‌ی k گام بچرخانید، که در آن k یک عدد غیر منفی است.

مثال ۱:
ورودی: nums = [1,2,3,4,5,6,7], k = 3
خروجی: [5,6,7,1,2,3,4]

توضیح:
چرخش ۱ گام به راست: [7,1,2,3,4,5,6]
چرخش ۲ گام به راست: [6,7,1,2,3,4,5]
چرخش ۳ گام به راست: [5,6,7,1,2,3,4]

مثال ۲:
ورودی: nums = [-1,-100,3,99], k = 2
خروجی: [3,99,-1,-100]

توضیح:
چرخش ۱ گام به راست: [99,-1,-100,3]
چرخش ۲ گام به راست: [3,99,-1,-100]

محدودیت‌ها:

  • ‎(1 \leq \text{nums.length} \leq 10^5)‎
  • ‎(-2^{31} \leq \text{nums[i]} \leq 2^{31} - 1)‎
  • ‎(0 \leq k \leq 10^5)‎

نکته (Follow up):
تلاش کنید تا حد امکان راه‌حل‌های مختلفی ارائه دهید. دست‌کم سه روش متفاوت برای حل این مسئله وجود دارد.
آیا می‌توانید این کار را به صورت درجا (in-place) با پیچیدگی فضایی O(1) انجام دهید؟

راه حل

public class Solution {
    public void Rotate(int[] nums, int k) {
        var length=nums.Length;
        k= k%length;

        Reverse(0, length-1, nums);
        Reverse(0, k-1, nums);
        Reverse(k, length-1, nums);
    }

    private void Reverse(int start, int end, int[] nums){
        while(end>start){
            var tmp=nums[start];
            nums[start]=nums[end];
            nums[end]=tmp;

            start++;
            end--;
        }
    }
}

کپی رایت © mhkarami97