我正在寻找算法滚动号例如;
我有一个包含数字 1、2、3、4 的数组。我想让我的新数组 4,1,2,3。
有谁知道如何做到这一点?
但不仅仅是 D[4];可以是 1,2,3,4,5,6,7
使用模运算可能是最优雅的方法。例如,您可以这样做:
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]
等。
#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}
对于slide
2,它将给出:
{4, 5, 1, 2, 3}
我是用 VC++ 写的。如果您使用 GCC 进行编译,请ARRAY_SIZE
使用_countof
.
就地版本:
#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]);
}
对于足够小的列表,您可以将列表加倍在一个大数组中,并让指针遍历大数组。我不确切知道如何在 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
,但时间与内存以及所有这些爵士乐。
#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;
}