实现数组翻转

题目来源于力扣–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];
	}
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值