1

我正在寻找算法滚动号例如;

我有一个包含数字 1、2、3、4 的数组。我想让我的新数组 4,1,2,3。

有谁知道如何做到这一点?

但不仅仅是 D[4];可以是 1,2,3,4,5,6,7

4

5 回答 5

2

使用模运算可能是最优雅的方法。例如,您可以这样做:

int a[size];
int b[size];

for (int n=0; n<size; n++) 
  b[(n+1)%size] = a[n];

如果您需要将元素移动多个位置,您可以更改b[(n+1)%size]tob[(n+2)%size]等。

于 2012-05-05T21:16:02.883 回答
1
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

/* Assumed slide is >= 0 and < arr_len. */
void slide_arr(int * arr, int arr_len, int slide)
{
  int i;
  /* If you are using C99, variable length array would be useful. */
  int * tmp_arr = malloc(arr_len * sizeof(int));
  memcpy(tmp_arr, arr, arr_len * sizeof(int));

  for(i = 0; i < arr_len; i++) {
    arr[i] = tmp_arr[(slide + i) % arr_len];
  }

  free(tmp_arr);
}

int main(void)
{
  int i;
  int arr[] = {1, 2, 3, 4, 5};
  slide_arr(arr, _countof(arr), 2);

  for(i = 0; i < _countof(arr); i++) {
    printf("%d, ", arr[i]);
  }

  return EXIT_SUCCESS;
}

给定数组{1, 2, 3, 4, 5}, as 1 将给出:slide_arr()slide

{5, 1, 2, 3, 4}

对于slide2,它将给出:

{4, 5, 1, 2, 3}

我是用 VC++ 写的。如果您使用 GCC 进行编译,请ARRAY_SIZE使用_countof.

于 2012-05-05T21:26:16.947 回答
1

就地版本:

#include <stdio.h>

void swap(int* a, int* b){
int temp = *a;
*a = *b;
*b = temp;
}

int main(){
int i;
int size = 4;
int arr[4] = {1,2,3,4};
for(i = 0; i < size; i++){
  printf("%d, ", arr[i]);
}
printf("\n");
for( i = size-1; i > 0; i-- ){
  swap(&arr[i],&arr[i-1]);
}
for(i = 0; i < size; i++){
  printf("%d, ", arr[i]);
}
于 2012-05-05T21:31:10.553 回答
1

对于足够小的列表,您可以将列表加倍在一个大数组中,并让指针遍历大数组。我不确切知道如何在 C 中做到这一点,但希望一个 C++ 示例能够理解这一点。

int x[] = { 1, 2, 3, 4, 1, 2, 3 };

然后,您可以让第二个指针向上移动数组,如下所示:

int* noshift = x;
int* oneshift = x + 1;
int* twoshift = x + 2;
int* threeshift = x + 3;

在本例中,第四次移位与不移位相同。这将占用更多的内存。对于n元素数组,这将占用数组中的元素2*n-1,但时间与内存以及所有这些爵士乐。

于 2012-05-05T21:32:09.673 回答
0
#include <stdio.h>
int main(){
 int i;
 int len = 5;
 int arr = {1,2,3,4,5};

 int last = arr[len-1]; // Last element of the array example(5)

 for(i = len - 1; i > 0 ; i--)
   arr[i] = arr[i-1];

 arr[0] = last;

 retrurn 0;
}
于 2012-10-04T05:23:42.127 回答