题目一:翻转单词顺序
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为了简单起见,标点符号和普通字符一样处理。例如输入字符串“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;
}