题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。
例如输入"I am a student.",则输出"student. a am I"。
思路:这个题目流传甚广,很多公司都多次拿来作面试题。首先,我们先考虑如何将一个字符串给反转过来,
void ReverseWord(char *pBegin, char *pEnd) //reverse a string
{
if(pBegin == NULL || pEnd == NULL)
return;
char temp;
while(pBegin < pEnd)
{
temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
pBegin++;
pEnd--;
}
}
void Reverse(char *pStr) //first,reverse whole sentence then,reverse every string.
{
if(pStr == NULL)
return;
char *pBegin = pStr;
char *pEnd = pStr;
char *p1 = pBegin;
char *p2 = pEnd;
while( *(pEnd+1) != '\0')
{
pEnd++;
}
ReverseWord(pBegin, pEnd);
while(p2 <= pEnd)
{
while(*(p2+1) != ' ' && *(p2+1) != '\0')
p2++;
ReverseWord(p1, p2);
p1 = p2 + 2;
p2 = p2 + 2;
}
}
问题二:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转的功能。比如输入字符串“abcdefg”和数字2,
该函数将返回左旋转2位得到的结果"cdefgab"。
思路:利用问题一的思想,利用三次反转。将abcdefg转化为cdefgab,可以看作成先将abcdefg整个的反转过来,变成gfedcba,然后再将前一个部分和后一个部分在反转一起,于是就变成了我们希望得到的cdefgab。
void LeftRotate(char *pStr, int n)
{
//左旋字符串
if(pStr == NULL || n < 0)
return;
char *pBegin = pStr;
char *pEnd = pStr + strlen(pStr) - 1;
int length =static_cast<int>(strlen(pStr));
if(n > length)
return;
ReverseWord(pBegin, pBegin+length-1);
ReverseWord(pBegin, pBegin + length - n - 1);
ReverseWord(pBegin + length - n, pEnd);
}