剑指Offer58:翻转字符串

博客记录了两道字符串相关题目的解题思路。一是翻转单词顺序,先翻转句子所有字符,再翻转每个单词字符;二是左旋转字符串,将字符串分段单独翻转后再整体翻转。结论指出字符串翻转实质是增加翻转次数并找合理位置翻转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为之前好像在哪看过类似这样的题目,但是看到第二小问,第一时间脑海没有解题思路,于是记录一下。

题目一:翻转单词顺序
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变,为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student.”
书上给的思路是:第一步翻转句子中所有的字符。比如翻转 “I am a student.”中所有字符得到“.tneduts a ma I”,此时不但翻转了句子中字符的顺序,连单词内的字符顺序也被翻转了。第二步再翻转每个单词中字符的顺序,就得到了“student. a am I”.这正是符合题目的输出。
这种方法就是全部翻转会改变所有单词字符内的顺序与位置,但是再根据空格翻转,这样就会达到想要的效果,不过这样要根据空格的位置来重新翻转。
代码:

	char* Reverse(char *pData)
	{
			if(pData == null)
			return null;
			char*pBegin = pData;
			char*pEnd = pData;
			while(*pEnd!='\0')
			pEnd++;
			pEnd--;
		//翻转整个句子
		Reverse(pBegin,pEnd);
		//翻转句子中每个单词
		pBegin = pEnd = pData;
		while(*pBegin!='\0'){
				if(*pBegin==' '){
				pBegin++;
				pEnd++:
				}else if(*pEnd== ' ' || *pEnd=='\0'){
				Reverse(pBegin,--pEnd);
				pBegin==++pEnd;
				}else{
				pEnd++;
				}
			}
			return pData;
	}
void Reverse(char* pBegin,char*pEnd){
		if(pBegin == null || pEnd==null)
		return ;
		while(pBegin < pEnd)
		{
			char temp = *pBegin;
			*pBegin = *pEnd;
				*pEnd = temp;
			pBegin++;pEnd++;
	}
}

题目二:
左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能,比如,输入字符串“abcdefg”和数字2,该函数将返回左旋转两位得到的结果“cdefgab”.

根据题目一,比如"hello world",先全部翻转,再单个字符翻转得到" world hello",就类比得到我们想要的结果,那么,如果我们把 ab看一部分,其余剩下的看另外一部分,那么,先单独翻转,即ab->ba ,cdefg->gfedc.然后再一次全部翻转,那么ba就翻到后面去了。

代码

	char* LeftRotateString(char* pStr,int n)
	{
			if(pStr!=null)
			{
				int nLength = strlen(pStr);
				if(nLength>0 && n>0 && n<nLength){
					char* pFirstStart = pStr;
					char* pFirstEnd = pStr+n-1;
					char* pSeStart = pStr+n;
					char* pSend   = pStr+nLength-1;
					//翻转字符串前面n个字符
					Reverse(pFirstStart,pFirstEnd);
					//翻转字符串后面的部分
					Reverse(pSeStart ,pSend);
					//翻转整个
					Reverse(pFirstStart,pSend);
					}
				}
				return pStr;
		}

结论:这提示我们,字符串的翻转,这一方法实质就是不断的增加翻转次数和找到合理的位置进行翻转。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值