题目来自剑指Offer
题目(1)
思路:
假设句子中的三个单词为XYZ,则我们要求的是ZYX。
给出字符串的转置性质:
可以推出:
此时可以推出思路一:
可以先对句子中的所有单词进行转置,之后再进行(句子)整体转置。
思路二:先进行句子转置,后对每一个单词转置,也是可以的。
代码:根据思路一写的:先对单词进行转置,之后对句子进行转置。
#include <iostream>
#include <assert.h>
using namespace std;
void Reverse(char* pStartStr,char* pEndStr)
{
assert(pStartStr && pEndStr);
assert(pEndStr >= pStartStr);
char cTmp;
while (pEndStr > pStartStr)
{
cTmp = *pStartStr;
*pStartStr = *pEndStr;
*pEndStr = cTmp;
pStartStr++;
pEndStr--;
}
}
char* ReverseSent(char* pStr)
{
assert(pStr);
int nLenStr = strlen(pStr);
if (nLenStr == 0)
{
return "";
}
//翻转单词
char* pStartWord = pStr;
char* pEndWord = pStr;
while(*pStartWord != 0)
{
if (*pStartWord == ' ')
{
pStartWord++;
pEndWord++;
}
else if (*pEndWord == 0 || *pEndWord == ' ')
{
pEndWord--;
Reverse(pStartWord,pEndWord);
pStartWord = ++pEndWord;
}
else
{
pEndWord++;
}
}
//翻转句子
Reverse(pStr,pStr + nLenStr - 1);
return pStr;
}
int main()
{
char Str[100] = " I am a Student. ";
cout<<ReverseSent(Str)<<endl;
system("pause");
return 1;
}
这里建议,使用思路一写代码,因为在处理左旋转字符串或者右旋转字符串时,就可以按照统一的思路做了,不易混淆。
左旋转字符串
题目:
所谓左旋:就是把字符串左边若干个单词移动到字符串尾部
举例:abcdefg - 左旋2位 - cdefgab
观察:把左边的字符串移动到右边时,其移动的字符串时整体移动的,内部字符也没有变化。这和问题一的思路是一样的。
思路:和第一个题目类似,可以根据旋转的单词个数,把字符串分成两部分XY。之后进行旋转。
旋转时注意:原始串为XY,目标串为YX。
步骤:
先对每一部分旋转,abcdefg 变成bagfedc
之后,对整个字符串进行翻转。bagfedc - cdefgab
代码:
char* ReverseSent(char* pStr,int nCount)
{
assert(pStr);
int nLenStr = strlen(pStr);
if (nLenStr < nCount)
{
return pStr;
}
//处理字符串
char* pStartFirst = pStr;
char* pEndFirst = pStr + nCount - 1;
char* pStartSec = pEndFirst + 1;
char* pEndSec = pStr + nLenStr - 1;
//翻转单词
Reverse(pStartFirst,pEndFirst);
Reverse(pStartSec,pEndSec);
//翻转句子
Reverse(pStr,pStr + nLenStr - 1);
return pStr;
}
右旋转字符串
所谓右旋:就是把字符串右边若干个单词移动到字符串头部
举例:abcdefg- 右旋5位 - cdefgab
观察:其实和左旋差不多,区别就是旋转的单词长度变化了。
即,右旋五位,相当于左旋2位。
思路:把右旋转换为左旋做,就ok了。
代码:
char* ReverseSent(char* pStr,int nCount)
{
assert(pStr);
int nLenStr = strlen(pStr);
if (nLenStr < nCount)
{
return pStr;
}
//处理字符串
char* pStartFirst = pStr;
char* pEndFirst = pStr + nLenStr - nCount - 1;// 和左旋的区别在这里
char* pStartSec = pEndFirst + 1;
char* pEndSec = pStr + nLenStr - 1;
//翻转单词
Reverse(pStartFirst,pEndFirst);
Reverse(pStartSec,pEndSec);
//翻转句子
Reverse(pStr,pStr + nLenStr - 1);
return pStr;
}