数组循环移动问题
问题描述:将一个具有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