举个例子
思路很简单,移就完事了
法1:
#include#include #include void Print(int *arr, int n) { for (int i = 0; i < n; i++) { printf("%-3d ", arr[i]); } } void Shift_Left(int *arr, int n) //左移一位 { assert(arr != NULL); if (n <= 1) { return; } int tmp = arr[0]; for (int i = 0; i < n; ++i) { arr[i] = arr[i + 1]; } arr[n - 1] = tmp; } void Shift_Right(int *arr, int n) //右移一位 { assert(arr != NULL); if (n <= 1) { return; } int tmp = arr[n-1]; for (int i = n - 1; i > 0; --i) { arr[i] = arr[i - 1]; } arr[0] = tmp; } //左移k位 void Shift_Left_k(int *arr, int n, int k) { assert(arr != NULL); if (n <= 1) { return; } k = k%n; //向左移动n位,等于移了0位 if (k > 0) { while (k--) { Shift_Left(arr, n); } } else //k<0向左移动为负,相当于右移 { while (k++) { Shift_Right(arr, n); } } } //右移K位,相当于左移-k位 void Shift_Right_k(int *arr, int n, int k) { Shift_Left_k(arr, n, -k); } int main() { int arr[] = { 12, 23, 34, 45, 56, 67, 78, 89, 90, 100 }; int n = sizeof(arr) / sizeof(arr[0]); Shift_Right_k(arr, n, 3); Print(arr, n); system("pause"); return 0; }
左移3位:
右移3位:
法二:
思路如图所示:
三步法:
先将前k位交换,再将k位之后的交换
最后整体交换
#include#include #include void Swap(int *arr,int left, int right) { int tmp = 0; while (left < right) { tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; left++; right--; } } void Three_Step_Left(int *arr, int n, int k) { assert(arr != NULL); if (n <= 1) { return; } k = k%n; if (k > 0) { Swap(arr, 0, k - 1); Swap(arr, k, n - 1); Swap(arr, 0, n - 1); } else { k = -k; Swap(arr, n - k, n - 1); Swap(arr, 0, n - k - 1); Swap(arr, 0, n - 1); } } void Three_Step_Right(int *arr, int n, int k) { Three_Step_Left(arr, n, -k); } void Print(int *arr, int n) { for (int i = 0; i < n; i++) { printf("%-3d ", arr[i]); } } int main() { int arr[] = { 12, 23, 34, 45, 56, 67, 78, 89, 90, 100 }; int n = sizeof(arr) / sizeof(arr[0]); Three_Step_Left(arr, n, 3); Print(arr, n); system("pause"); return 0; }
不管移动几位,只移动n次
左移4位:
右移4位:
法三:
结构之法
#include#include #include #define N 10 struct Shift_Arr { int arr[N]; int index; int maxsize; }; int Get_Elem(const struct Shift_Arr *par, int pos) //得到pos下标的元素 { if (par == NULL || pos < 0 || pos >= par->maxsize) { exit(1); } return par->arr[(par->index + pos) % par->maxsize]; } void Shift_Left(struct Shift_Arr *par, int k) //左移k位 { assert(par != NULL && k>0); k = k%par->maxsize; par->index = par->index + k; } int main() { int k = 0; printf("请输入左移几位!n"); scanf("%d", &k); struct Shift_Arr Arr = { { 12, 23, 34, 45, 56, 67, 78, 89, 90, 100 }, 0, N }; Shift_Left(&Arr, k); for (int i = 0; i < N; i++) { printf("%d ", Get_Elem(&Arr, i)); } system("pause"); return 0; }
对这段代码稍作分析:
思路:
充分利用了%取模运算符,如果pos=4,会从第五个元素开始打印,当i+pos等于 maxsize时,此时再模上maxsize,又从第一个元素开始打印,直到 i==N时退出循环,此时所有元素都被打印过了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)