数组循环移动问题

数组循环移动问题

问题描述:将一个具有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
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值