سوال 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--;
}
}
}