C语言第四十二弹---使用多种方法实现字符串左旋转

使用多种方法实现字符串左旋转

一、 左移法

思路:每一次通过移动第一个字符,然后把后面的字符前移,然后再进行移动第一个字符再前移。故需要使用嵌套循环,外层循环控制移动第一个字符的次数,第二个循环进行字符前移

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 

void left_move(char* arr, int k)
{	
	assert(arr);//断言引用头文件 
	int len = strlen(arr);//注意引头文件 
	for (int i = 0; i < k; i++)
	{
		char tmp = *arr;//使用临时值接收第一个字符
		for (int j = 0; j < len - 1; j++)//前移
		{
			*(arr + j) = *(arr + j + 1);
		}
		*(arr + len - 1) = tmp;//把最后一个字符放回最后一个数组位置
	}
}
int main()
{
	int k = 0;
	char arr[30] = "ABCD";
	printf("请输入要左旋转字符的个数k:");
	scanf("%d",&k);
	left_move(arr, k);
	printf("%s", arr);
	return 0;
}

二、分步逆序法

思路:先使用一个移动函数,把前k个字符反转,再移动k后面字符反转。最后整体反转。即数组ABCD k为2,1.BA->2.DC->3DCBA。

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 

void reserve(char* left,char* right)//初始位置 旋转位置
{
	assert(left && right);
	while (left < right)//循环进行交换字符
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}

void left_move(char* arr, int k)
{
	int len = strlen(arr);
	reserve(arr,arr+k-1);
	reserve(arr+k, arr+len-1);
	reserve(arr,arr+len-1);
}

int main()
{
	int k = 0;
	char arr[30] = "ABCD";
	printf("请输入要左旋转字符的个数k:");
	scanf("%d",&k);
	left_move(arr, k);
	printf("%s", arr);
	return 0;
}

三、函数法

思路:使用strncat把数组arr复制一份并放在arr数组中。通过循环直接获取对应位置字符串方法arr2即可。

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 


void left_move(char* arr, char* arr2, int k)
{
	int len = strlen(arr);
	strncat(arr, arr, len);//ABCD->ABCDABCD

	for (int i = 0; i < len; i++)
	{
		arr2[i] = *(arr + k + i);//获取k + i个字符
	}
}

int main(void)
{
	int k = 0;
	char arr[30] = "ABCD";
	char arr2[30] = { '\0'};
	printf("请输入要左旋转字符的个数k:");
	scanf("%d", &k);
	left_move(arr,arr2,k);
	printf("%s", arr2);
	return 0;
}

你可能感兴趣的:(c语言,算法,数据结构)