[剑指offer]面试题42:翻转单词顺序 VS左旋转字符串
Posted Wecccccccc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[剑指offer]面试题42:翻转单词顺序 VS左旋转字符串相关的知识,希望对你有一定的参考价值。
面试题42:翻转单词顺序 VS左旋转字符串
题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student.a am 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;
}
测试用例:
● 功能测试(句子中有多个单词,句子中只有一个单词)。
● 特殊输入测试(字符串指针为 NULL 指针、字符串的内容为空、字符串中只有空格)。
题目二:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。
代码如下:
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;
}
与字符串相关的代码通常要注意这两点:
一是输入空指针 NULL 时程序会崩溃;
二是内存访问越界的问题,也就是试图访问不属于字符串的内存。例如如果输入的n小于0,指针pStr+n指向的内存就不属于字符串。如果我们不排除这种情况,试图访问不属于字符串的内存就会留下严重的内存越界的安全隐患。在前面的代码中,我们添加了两个if判断语句就是为了防止出现这两种问题。
测试用例:
● 功能测试(把长度为n的字符串左旋转0个字符、1个字符、2个字符、n-1个字符、n个字符、n+1个字符)。
● 特殊输入测试(字符串的指针为NULL指针)。
本题考点:
● 考查知识迁移的能力。当面试的时候遇到第二个问题,而之前我们做过“翻转句子中单词的顺序”这个题目,那如果能够把多次翻转字符串的思路迁移过来,就能很轻易地解决字符串左旋转的问题。
● 考查对字符串的编程能力。
以上是关于[剑指offer]面试题42:翻转单词顺序 VS左旋转字符串的主要内容,如果未能解决你的问题,请参考以下文章