#include <stdio.h>
#include <stdlib.h>
#define MAX 10
int main()
{
int niz[MAX], i, pom;
// two more var, n,m=0;
char c;
for(i=0;i<MAX;i++)
{
niz[i]=rand()%100;
}
for(i=0;i<MAX;i++)
{
printf("%d\n", niz[i]);
}
printf("\n\nEnter L(l) for left shift or R(r) for right shift\n");
scanf("%c", &c);
if(c=='L' || c=='l')
{
//while(m<n) and on the end n++; or for(m=0;m<n;m++)... you know what i mean
//but its not working...
pom=niz[0];
for(i=0;i<MAX-1;i++)
{
niz[i]=niz[i+1];
}
niz[MAX-1]=pom;
//for loop to shift array for 1 position
}
else if(c=='R' || c=='r')
{
//.....
pom=niz[MAX-1];
for(i=MAX-1;i>0;i--)
{
niz[i]=niz[i-1];
}
niz[0]=pom;
//for loop to shift array for 1 position
}
for(i=0;i<MAX;i++)
{
printf("%d\n", niz[i]);
}
return 0;
}
好的,这是将数组向左或向右移动1个位置的代码,它工作正常。但是,如果我想为n位置移位数组,我首先想到的只是将IF和ELSE IF中的代码放在一个循环中,这将重复直到某个变量增加到小于n,我尝试从IF和ELSE IF中放入代码虽然和for循环,但它没有工作..顺便说一下,我的方法是替换n位置的数组......?
答案 0 :(得分:1)
我的基本想法是复制原始数组,然后根据移位索引将数组元素设置到副本中。在获得n
的值和转换方向(以及任何错误检查)之后,这是我的方法:
if(toupper(c)=='L')
{
n = -n;
}
for(i=0;i<MAX;i++)
{
copy[i] = niz[i];
}
for(i=0;i<MAX;i++)
{
shift_i = (i+n+MAX) % MAX;
niz[i]=copy[shift_i];
}
由于n
可能是负数,因此我在获取模数之前将数组的长度添加到它。就地转移会更有效率,但我还没想出来。您需要以某种方式跟踪原始值。
答案 1 :(得分:1)
如果您正在处理数组,则需要至少复制一次每个元素。
让我们调用S作为数组的大小。
最省时的方法是将数组拆分为两个连续的部分,将最小的数组复制到一个临时存储(长度最多为S / 2),将最大的块移动到位,然后复制回来它所属的最小块。
这将需要最多3S / 2份。
最节省空间的是逐个交换元素,只需要一个元素进行临时存储,但这样会更慢(你会失去块副本的好处)。