剑指offer——翻转字符串

题目一:翻转单词顺序

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为了简单起见,标点符号和普通字符一样处理。例如输入字符串“I am a student.”,则输出“student. a am I”。

思路:

       这道题可以分为两步来做,第一步是翻转句子中所有的字符。比如翻转上面字符串的结果为“.tneduts a ma I”,然后再翻转其中每个单词中的字母顺序,就可以得到答案了。

代码:

void Reverse(char* pBegin, char* pEnd)
{
	if (pBegin == nullptr || pEnd == nullptr)
		return;
	while (pBegin<pEnd)
	{
		char temp = *pBegin;
		*pBegin = *pEnd;
		*pEnd = temp;
		
		pBegin++; pEnd--;
	}


}

char* ReverseSentence(char *pData)
{
	if (pData == nullptr)
		return nullptr;

	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;
	
}

题目二:左旋转字符串。

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

 

思路:

      这道题的思路其实是一样的,比如“hello world”,翻转这个句子中单词的顺序就得到了“world hello”,这样可以看做是原始字符串中向左旋转了若干位得到的。那么用这种方法,先把要旋转的位数和不旋转的位数分为两个部分,然后先分别翻转这两个部分,再翻转整个字符串就可以得到最后的结果,其实这两个大步骤可以是相反的。

 

代码:

void Reverse(char* pBegin, char* pEnd)
{
	if (pBegin == nullptr || pEnd == nullptr)
		return;
	while (pBegin<pEnd)
	{
		char temp = *pBegin;
		*pBegin = *pEnd;
		*pEnd = temp;
		
		pBegin++; pEnd--;
	}


}

char* LeftRotateString(char*pStr, int n)
{
	if (pStr != nullptr)
	{
		int nLength = static_cast<int>(strlen(pStr));
		if (nLength > 0 && n > 0 && n < nLength)
		{
			char* pFirstStart = pStr;
			char* pFirstEnd = pStr + n - 1;
			char*pSecondStart = pStr + n;
			char*pSecondEnd = pStr + nLength - 1;
			//翻转字符串前面的n个字符
			Reverse(pFirstStart, pFirstEnd);
			//翻转字符串的后面
			Reverse(pSecondStart, pSecondEnd);
			//翻转整个字符串
			Reverse(pFirstStart, pSecondEnd);
		}

	}
	return pStr;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值