:左转字符串

Posted 骨灵冷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了:左转字符串相关的知识,希望对你有一定的参考价值。

题目描述:字符串的左转操作:将字符串前面的若干个字符移动到字符串的尾部。

    例如:把字符串abcdef 左旋转2位得到字符串cdefab。

要求:要求对字符串实现左旋转操作,并且对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1).

方法一、

我们可以讲字符串的左转想成如下过程:假设左转1个字符:

(1)、先把第一个字符提取出来;

(2)、后续的字符依次往前进一个;

(3)、完毕之后,把提取出来的第一个字符加到最后。

代码实现如下:

#include "LeftMoveChars.h"



void leftmovechars(char str[]);
int main()

	char str[] = "abcdef";//此字符串长度为7,记得'\\0'
	printf("左转之前的字符串:%s\\n",str);
	leftmovechars(str);
	printf("左转之后的字符串:%s\\n",str);

	getchar();
	return 0;


void leftmovechars(char str[])

	char ch = str[0];
	for (int i = 1;i < 6;i++)
	
		str[i-1] = str[i];
	
	str[5] = ch;
	return;
运行结果如下图:


完成了一个字符串的旋转之后,假如要完成前n个字符串,只需要对上述操作循环n次就行:

修改后的代码如下:

修改leftmovechars为如下方法:

void leftmovechars_by_n(char str[],int n)

	for (int j = 0;j<n;j++)
	
		char ch = str[0];
		for (int i = 1;i < 6;i++)
		
			str[i-1] = str[i];
		
		str[5] = ch;
	
	return;

在主函数调用:

int main()

	char str[] = "abcdef";//此字符串长度为7,记得'\\0'
	printf("左转之前的字符串:%s\\n",str);
	//leftmovechars(str);
	leftmovechars_by_n(str,3);
	printf("左转之后的字符串:%s\\n",str);

	getchar();
	return 0;


得到的运行结果如下:


如此我们就完成了字符串的左旋转。

但是该方法有个缺点,被移动的字符串都是一个个的被移动,由于考虑题目特点,被移动的字符串应当是整体的,可以被打包在一起整体移动的,所以我们可以采用下面的方法。

方法二、

主要思路如下:假设有7个长度的字符串abcdef‘\\0’,左旋长度为3,那么将abc绑定在一起,依次往后移动

实现上可以设置两个指针p1、p2,分别指向第一个字符和第m个字符,这里的m是左旋长度

所以分别一一对应将两个数据交换,然后p1和p2分别向后移动。这里需要考虑两个问题,长度是否正好是旋转长度的整数倍,若不是,需要考虑p2指针移动长度不足的情况,此时只要把p2之后的数据和p1之后的数据有多少就交换多少就可以,而最后的'\\0'不能被交换,否则系统会发生缺省读取'\\0'之后的数据。

在最后不足长度的情况下做最后交换时,p1指针的最后一个数据优于无法和'\\0'做交换,所以需要p1内部排序,将p1开始之后的数据全部赛到已交换的p1数据之后。

函数代码如下:

void leftmovechars_by_points(char str[],int n)

	//首先获取字符串的长度
	int length = 0;
	while (*(str+length)!='\\0')
	
		length++;
	
	printf("字符串长度为:%d\\n",length);
	//先定义两个指针,第一个指针指向第一个元素,第二个指针指向第n个元素;
	char* p1 = &str[0];
	char* p2 = &str[n];
	
	char temp;
	int mod = length % n;
	int x = length / n;
	if (0 == mod)
	
		//从两个指针所指的位置开始两段长度为n的字符串的一一对应交换
		while ( x-- != 1)
		
			for(int i = 0;i<n;i++)
			
				temp = *p1;
				*p1 = *p2;
				*p2 = temp;
				p1++;
				p2++;
			
		
	
	else
	
		//首先先交换x-1次
		//从两个指针所指的位置开始两段长度为n的字符串的一一对应交换
		while ( x-- != 1)
		
			for(int i = 0;i<n;i++)
			
				temp = *p1;
				*p1 = *p2;
				*p2 = temp;
				p1++;
				p2++;
			
		
		while (*(p2)!='\\0')
		
			temp = *p1;
			*p1 = *p2;
			*p2 = temp;
			p1++;
			p2++;
		
		if (*(p2) == '\\0')
		
			char* q = p1+1;
			for (int k = 0;k < n-1 ;k++)
			
				temp = *p1;
				*p1 = *q;
				*q = temp;
				p1 = q;
				q = q++;
			
		
	
	return;
程序运行结果:



以上是关于:左转字符串的主要内容,如果未能解决你的问题,请参考以下文章

字符串拼接大全

规定输入的字符串中只包含字母和*号.

C语言试题十四之使字符串的前导*号不得多于n个;若多于n个,则删除多于的*号;若少于或等于n个,则什么也不做。字符串中间和尾部的*号不删除。

C语言试题六十一之请编写函数fun:将s所指字符串中下标为偶数的字符删除,串中剩余字符形成新串放在t所指数组中。

C语言试题六十一之请编写函数fun:将s所指字符串中下标为偶数的字符删除,串中剩余字符形成新串放在t所指数组中。

C语言试题六十三之请编写函数fun:将s所指字符串中ascii值为偶数的字符删除,串中剩余字符形成一个新串放在t所指的数组中。