多种方法实现字符串旋转

多种方法实现字符串旋转_第1张图片

各位老铁们,今日分享一个博客——如何用多种方法来实现字符串的旋转

可别不在意哟,这可是面试经典题之一!!!

 把字符串 "abcd" 经过3次旋转后实现  "dabc"

                     法一:一个一个旋转

                              法二:借助库函数

                                               法三:局部旋转

第一种方法也是我们大家最常想到的方法:一个一个旋转

a b c

d

多种方法实现字符串旋转_第2张图片

多种方法实现字符串旋转_第3张图片 

 多种方法实现字符串旋转_第4张图片

多种方法实现字符串旋转_第5张图片 

我们以此类推即可,第5 次旋转结果和第一次的一样,所以我们可以把旋转次数 的代码这样写

                int len = strlen(str);
                int time = k % len;                //求字符串旋转次数

#define _CRT_SECURE_NO_WARNINGS
#include
#include

void LeftRound2(char* str, int k)
{
	// 普遍的写法:一个一个旋转
	int len = strlen(str);
	int time = k % len;				//求字符串旋转次数
	for (int i = 0; i < time; i++)
	{
		int tmp = str[0];
		int j = 0;
		for (; j < len-1 ; j++)
		{
			str[j] = str[j + 1];
		}
		str[j] = tmp;
	}

}
int main()
{
	/*
	实现字符串的旋转
	思路: 旋转的次数   怎么挪动字符
	*/
	char str[] = "abcd";  // 只能用字符串来初始化字符串数组   不能写成 char* str = "abbcd";
	LeftRound2(str, 3);
	printf("%s\n", str);


	return 0;
}

 第二种方法:借助库函数

思路:先求出需要旋转的次数==》借助临时数组来存放字符串==》需要用到函数:strcpy():字符串拷贝    strncat()  字符串追加

多种方法实现字符串旋转_第6张图片

进行3次左旋转

借助strcpy() 把 剩余的字符串拷贝到临时数组中

    char tmp[256] = { 0 };
    strcpy(tmp,str+time);

借助strncat() 把 "abc" 追加到d 的后面即可

多种方法实现字符串旋转_第7张图片

 strncat(tmp, str, time);

最后再把临时数组里面内容拷贝到原来数组str

多种方法实现字符串旋转_第8张图片

 

#include
#include
void LeftRound1(char* str, int k)
{
	/*
	借助库函数      strcpy:字符串拷贝   strncat :字符串追加
	*/
	int len = strlen(str);
	int time = k % len;				//求字符串旋转次数
	 //借助一个临时数组存放旋转后的字符串,之后再拷贝到str
	char tmp[256] = { 0 };
	strcpy(tmp,str+time);				
	strncat(tmp, str, time);
	strcpy(str, tmp);

}
int main()
{
	/*
	实现字符串的旋转
	思路: 旋转的次数   怎么挪动字符
	*/
	/*
	借助库函数      strcpy:字符串拷贝   strncat :字符串追加
	*/
	char str[] = "abcd";  // 只能用字符串来初始化字符串数组   不能写成 char* str = "abbcd";
	LeftRound1(str, 3);
	printf("%s\n", str);


	return 0;
}

 第3种方法:

核心在于:数组的逆置,下标位置的确定

多种方法实现字符串旋转_第9张图片

void Reverse(char* str, int left, int right)
{
		// 逆置数组
	while (left < right)
	{
		int tmp = *(str + left);
		*(str + left) = *(str + right);
		*(str + right) = tmp;
		left++;
		right--;
	}
}
void LeftRound3(char* str, int k)
{
	// 局部旋转  只需进行翻转3次即可
	//逆置数组   确定下标位置
	int len = strlen(str);
	int time = k % len;				//求字符串旋转次数

	Reverse(str,0,k - 1);
	Reverse(str, k,len-1);
	Reverse(str, 0, len - 1);

}
int main()
{
	/*
	实现字符串的旋转
	思路: 旋转的次数   怎么挪动字符
	*/
	char str[] = "abcd";  // 只能用字符串来初始化字符串数组   不能写成 char* str = "abbcd";
	LeftRound3(str, 3);
	printf("%s\n", str);


	return 0;
}

以上代码运行结果:

多种方法实现字符串旋转_第10张图片

ok~~~以上就是我要为大家share 的内容,各位老铁们要是感觉还不错的话,咱一波赞走起!!!

多种方法实现字符串旋转_第11张图片

你可能感兴趣的:(算法,c++,开发语言,c语言)