字符串左旋问题

问题描述:将一个字符串左旋n个字符

例如“abcd”左旋俩个字符得到“cdab”

法一:暴力循环法

左旋几个就循环几次

第一次循环,先将首字符a存放在临时变量中,然后将bcd分别向前移动一位,最后将a补加到字符串末尾;以此类推

#define _CRT_SECURE_NO_WARNINGS 1
#include

#include
void leftround(char* arr, int n)
{
	int i, j;
	int len = strlen(arr);
	int times = n % len;//对于长度为4的字符串,左旋5个字符就相当于左旋1个字符!!!
	for (i = 0; i < n; i++)//左旋n次就循环n次
	{
		char ret = arr[0];//先将第一个字符保存好,防止被覆盖了
		for (j = 0; j < len - 1; j++)
		{
			arr[j] = arr[j + 1];//向前移动一个字符
		}
		arr[j] = ret;//循环出来时,j恰好是左后一个元素的下标
	}
}
int main()
{
	char arr[] = "abcde";
	int n;
	scanf("%d", &n);
	leftround(arr, n);
	printf("%s", arr);
	return 0;
}

法二:库函数实现法

#define _CRT_SECURE_NO_WARNINGS 1
#include

#include
void leftround(char* arr, int n)
{
	int len = strlen(arr);
	int pos = n % len;//前后断开的位置
	char tem[10];
	strcpy(tem, arr + pos);//先把后面的拷贝过去
	strncat(tem, arr, pos * sizeof(arr[0]));
	strcpy(arr, tem);
}
int main()
{
	char arr[] = "abcde";
	int n;
	scanf("%d", &n);
	leftround(arr, n);
	printf("%s", arr);
	return 0;
}

法三:三次反转法

对于abcde,左旋3个字符

首先将abc倒转,其次将de倒转,这两步得到了cbaed

最后将整个数组倒转得到deabc

#define _CRT_SECURE_NO_WARNINGS 1
#include

#include
void reverse(char*arr,int left, int right)
{
	while (left < right)
	{
		char ret = arr[left];
		arr[left] = arr[right];
		arr[right] = ret;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "abcde";
	int n;
	scanf("%d", &n);
	int len = strlen(arr);
	int pos = n % len;
	reverse(arr, 0, pos - 1);
	reverse(arr, pos, len - 1);
	reverse(arr, 0, len - 1);
	printf("%s", arr);
	return 0;
}

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