目录
数组的左右旋:
1.0 :
2.0:
3.0:
1.0 :
思路:找出数学规律,原数组的值赋给另一个代替数组,再打印出来就行了(这样不是真的左右旋)。(如果想要arr数组自身左右旋,让brr数组的值重新赋给arr数组就行了)
规律:右旋的是原来下标为i的元素编程下标为(i + k)% n的值。右旋的是原来下标为i的元素编程下标为(n + i - k)% n的值。(n为数组元素个数,k为左右旋步数,i为0~4的一个数)
我没有写左旋的代码,只写了右旋的代码。
1.0代码如下
#include2.0:// 1.0 只是让结果打印出来 并没有交换 int main(void) { int arr[5] = { 1,2,3,4,5 }; int brr[5] = { 0 }; int k = 0; int n = sizeof(brr) / sizeof(brr[0]); int i = 0; scanf("%d", &k); k %= n; //如果用右旋解出左旋 k = n - k; //右旋 左旋可以 //1 2 3 4 5 左旋2次 //0 1 2 3 4 下标 //3 4 5 1 2 左旋后 //0 1 2 3 4 下标 //1 2 3 4 5 左旋3次 //0 1 2 3 4 下标 //4 5 1 2 3 左旋后 //0 1 2 3 4 下标 //单独左旋 省了一次循环 for ( i = 0; i < n; i++) { brr[i] = arr[(k + i)%n]; printf("%d ", brr[i]); } return 0; }
思路:先找到数组旋一次的方法,再用循环进行多次旋。
一次旋:
右旋,让数组最后一个元素赋给t,然后前面每一个元素向后移动一位,最后让t的值赋给第一个元素。
左旋,让数组第一个元素赋给t,然后后面每一个元素向前移动一位,最后让t的值赋给最后一个元素。
兴趣一来就让代码做的有趣了一点。
2.0代码如下
#include3.0:// 2.0 //菜单函数的定义 void meun(); //左旋函数的定义 void arr_move1(int* arr, int n, int k); //右旋函数的定义 void arr_move2(int* arr, int n, int k); //打印函数的定义 void arr_print(int* arr, int sz); void meun()//菜单的实现 { printf("###############################n"); printf("####### 1:左旋 2:右旋#########n"); printf("###############################n"); } void arr_move1(int* arr, int n, int k)//左旋 { int t = 0; while (k--) { int i = 0; t = *(arr + 0); for (i = 0; i < n; i++) { *(arr + i) = *(arr + i + 1); } *(arr + i) = t; } } void arr_move2(int* arr, int n, int k)//右旋 { int t = 0; while (k--) { int i = 0; t = *(arr + n); for (i = n; i > 0; i--) { *(arr + i) = *(arr + i - 1); } *(arr + i) = t; } } void arr_print(int* arr, int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d ", *(arr + i)); } printf("n"); } int main(void) { int arr[5] = { 1,2,3,4,5 }; int k = 0; int sz = sizeof(arr) / sizeof(arr[0]); int direction = 0; meun(); printf("请分别输入移动的方向和步数:>"); scanf("%d%d", &direction, &k); k = k % sz; if (direction != 1 && direction != 2) { printf("方向输入错误,请重新输入方向:>"); scanf("%d", &direction); } switch (direction) { case 1: arr_move1(arr, sz - 1, k); break; case 2: arr_move2(arr, sz - 1, k); break; default: break;//这里忘了写语句 程序没通过 说少了分号 } arr_print(arr, sz); return 0; }
思路:让代码分成两截,分别倒置,最后再整体倒置。
例如右旋2次,让1,2,3,4,5分成两截1 2 3 4 5,分别倒置得3 2 1 5 4,最后再整体倒置得4 5 1 2 3.
3.0代码如下
#include// 右旋函数的定义 整形数组3.0 void Arr_Right_move(int* arr, int n, int k); // 左旋函数的定义 整形数组3.0 void Arr_Left_move(int* arr, int n, int k); //翻转函数的定义 整形数组3.0 void Arr_Over_move(int* arr, int left, int right); //打印函数的定义 void arr_print(int* arr, int sz); void Arr_Right_move(int* arr, int n, int k)//右旋 { Arr_Over_move(arr, 0, n - k - 1); Arr_Over_move(arr, n - k, n - 1); Arr_Over_move(arr, 0, n - 1); } void Arr_Left_move(int* arr, int n, int k)//左旋 { Arr_Over_move(arr, 0, k - 1); Arr_Over_move(arr, k, n - 1); Arr_Over_move(arr, 0, n - 1); } void Arr_Over_move(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 arr_print(int* arr, int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d ", *(arr + i)); } printf("n"); } // 3.0 int main(void) { int arr[5] = { 1,2,3,4,5 }; int sz = sizeof(arr) / sizeof(arr[0]); int i = 0; int k = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } printf("n"); scanf("%d", &k); k %= sz; //右旋直接算 //左旋 //k = sz - k;//用右旋算左旋 //Arr_Left_move(arr, sz, k); Arr_Right_move(arr, sz, k);//现在算的是右旋 arr_print(arr, sz); return 0; }
如有错误还请各位大佬斧正(看到错误的人在我的眼里都是大佬),
希望你我都成为一个谨慎的人。(没看过吞噬星空小说,只是想成为罗峰那样谨慎的人)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)