题目:
给你一个数组,将数组中的元素向右轮转 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]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/rotate-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法一:
for(int i=k;k>0;k--){ //控制轮转次数
int m=nums[numsSize]; //将最后一位数据取出
for(int j=numsSize-1;j>=0;j--){ //控制数组数据移动
nums[j]=nums[j-1]; //将前n-1个数据都往后移一位
}
nums[0]=m; //将最后一位的值赋给第一位
}
这是最原始的大概思路,时间复杂度O(n2) 如果数组很大,太浪费时间
方法二:
主要思想:
根据实例对比:
原数组: [1,2,3,4,5,6,7]
输出: [5,6,7,1,2,3,4]
轮转次数: k = 3
可得 轮转几次,便会将几个数据移动到数组前面,因此可以切分数组
将需要移动的数据存放入新的数组中,再将剩下的移动到数组尾部,最后把新数组中的赋值到数组前部即可,不需要嵌套循环,节省时间
部分代码:
for(int i=numsSize-k;i<=numsSize-1;i++){ //将需要换位置的数组存到新的数组里
nums2[j]=nums[i];
j++;
}
for(int l=numsSize-k-1;l>=0;l--){ //轮转几次,就将剩下数据直接向后移动几位
nums[l+k]=nums[l];
}
for(int a=0;a<k;a++){ //将新数组的数据插入到数组前面
nums[a]=nums2[a+1];
}
遇到的问题:
- 数组的长度和轮转次数的大小
- 数组下标的溢出
- 数据的移动
完整代码:
void rotate(int* nums, int numsSize, int k){
int nums2[k+1]; //防止数组下标溢出
nums2[0]=0;
int j=1;
while(numsSize<k) //轮转次数大于数组长度,会出现负值
{
k=k-numsSize;
}
if(numsSize>=k){
for(int i=numsSize-k;i<=numsSize-1;i++){
nums2[j]=nums[i];
j++;
}
for(int l=numsSize-k-1;l>=0;l--){
nums[l+k]=nums[l];
}
for(int a=0;a<k;a++){
nums[a]=nums2[a+1];
}
}
}
第一次写题解,这些只是自己的一些体会和想法,通过这次解题,对数组有了更深的认识,如果有错误,请大家多多包涵,也希望大家可以指出我的错误,谢谢大家!