C语言典型题——数组左旋右旋

C语言典型题——数组左旋右旋,第1张

C语言典型题——数组左旋右旋 数组的左右旋

目录

数组的左右旋:

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代码如下

#include
//           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;
}
2.0:

思路:先找到数组旋一次的方法,再用循环进行多次旋。

一次旋:

右旋,让数组最后一个元素赋给t,然后前面每一个元素向后移动一位,最后让t的值赋给第一个元素。

左旋,让数组第一个元素赋给t,然后后面每一个元素向前移动一位,最后让t的值赋给最后一个元素。

兴趣一来就让代码做的有趣了一点。

2.0代码如下

#include
//   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;
}
3.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;
}

如有错误还请各位大佬斧正(看到错误的人在我的眼里都是大佬),

希望你我都成为一个谨慎的人。(没看过吞噬星空小说,只是想成为罗峰那样谨慎的人)

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5702468.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存