【算法题】25.轮转数组

题目

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例1

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

思路

我们可以使用翻转数组。这样尾部的 k \bmod n个元素就被移至数组头部,然后我们再翻转 [0, k \bmod n-1] 区间的元素和 [k \bmod n, n-1] 区间的元素即能得到最后的答案。

代码实现


void swap(int *a, int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}

void reverse(int*nums, int start,int end){
    while(start<end){
       swap(&nums[start],&nums[end]);
        start++;
        end--;
     }
}

void rotate(int* nums, int numsSize, int k){
     k %= numsSize;
     reverse(nums,0,numsSize-1);
     reverse(nums,0,k-1);
     reverse(nums,k,numsSize-1);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。