题目来源于力扣–https://leetcode-cn.com/
一、一般能想到的最简单的方法,就是每次把最后一个位置的元素暂时保存一下,然后将其余的元素忘后移动,然后将暂时保存的元素放到第一个位置,这个方法简单容易想到,但是性能不够好。时间复杂度O(n²)。
继续更新其他方法。
主函数代码
#include<stdio.h>
void rotate(int* nums, int numsSize, int k);
int main(){
// 初始化数组
int nums[7] = {1,2,3,4,5,6,7};
// 旋转的次数
int k = 3;
rotate(nums,7,k);
for(int i = 0;i<7;i++){
printf("%d ",nums[i]);
}
return 0;
}
旋转函数代码(1)
/*
最好想到的办法就是将最后一个元素保存一下,将其余元素往后移,最后将保存的元素放到第一个位置
*/
void rotate(int* nums, int numsSize, int k){
for(int i=0;i<k;i++){
// 临时变量存储数组最后一个元素
int temp = nums[numsSize-1];
for(int j=numsSize-1;j>0;j--){
nums[j] = nums[j-1];
}
// 将最后一个元素放到第一个位置
nums[0] = temp;
}
}
旋转函数代码(2)
仔细观察翻转几次就是将元素往后移动几次,每个元素的位置加上k即可,但是会出现超过数组长度的情况,所以要对数组长度取余,不能超过数组长度,超过就从数组头部开始放。但是会出现一个问题,你第一个位置的元素放到第四个位置的时候,第四个位置的元素不就被覆盖了吗?所以需要开辟另一个空间,来临时存储我们的数组。时间复杂度O(n)。是不是算法的效率更高了呢!但是空间复杂度变高了!拿空间换取时间效率。
/*
仔细观察翻转几次就是将元素往后移动几次,每个元素的位置加上k即可,但是会出现超过数组长度的情况,所以要对数组长度取余,不能超过数组长度,
超过就从数组头部开始放。但是会出现一个问题,你第一个位置的元素放到第四个位置的时候,第四个位置的元素不就被覆盖了吗?所以需要开辟另一个
空间,来临时存储我们的数组。
*/
void rotate(int* nums, int numsSize, int k){
// 临时数组
int tempNums[numsSize];
// 存放我们的数组
for(int i=0;i<numsSize;i++){
tempNums[i] = nums[i];
}
// 进行翻转
for(int j=0;j<numsSize;j++){
// 第j个元素翻转k次之后的新位置,
nums[(j+k)%numsSize] = tempNums[j];
}
}