数组循环移动问题

博客探讨了如何高效地解决数组循环左移或右移的问题。通过分析三种不同的解法,包括使用额外存储空间的解法一,多次移动的解法二,以及最优的解法三——仅需交换N次元素并使用一个临时空间。解法三在效率和空间占用上具有优势。
摘要由CSDN通过智能技术生成

数组循环移动问题

问题描述:将一个具有N个元素的数组循环左移或右移。

分析如下(以循环左移为例)

解法一:

先将数组中的前 i 个元素存放在一个临时数组中,再将余下的 N - i 个元素左移 i 个位置,最后将前 i 个元素从临时数组复制回原来数组中后面的 i 个位置,这个解法总共需要移动 i + ( N - i ) + i = i + N 次数组元素,但使用了 i 个额外的存储空间。

解法二:

先设计一个函数将数组向左循环移动一个位置,然后在调用该函数 i 次,这样只使用了一个额外的存储空间,但总共需要移动 i * N 次数组元素。

解法三:

先将数组前 i 个元素置逆,再将数组余下的 N - i 个元素置逆,最后将数组整体置逆。此方法总共需要交换 i / 2 + ( N - i ) / 2 + N / 2 = N

次数组元素,并且只使用了一个用于交换的临时空间。

综合可知,解法三最优,以下为解法三的代码实现:

  • 循环左移
#include<stdio.h>
#include<string.h>
void reverse(char a[],int start,int end){
   
	int temp;
	for(int i=start;i<(start+end+1)/2;i++){
   
		temp=a[i];
		a[i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值