题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student.”,则输出"student. a am I"。
分析:第一步翻转句子中所有的字符。比如翻转“I am a student.”中的所有字符“.tneduts a ma I”,此时不但翻转了句子单词的顺序,单词内部的字符顺序也被翻转了.第二步再翻转每一个单词中字符的顺序,就得到了"student. a am I"
这种思路关键在于实现一个函数一翻转字符串的一段,下面的函数Reverse可以完成这个功能。
void Reverse(char *pBegin,char *pEnd)
{
if(pBegin==NULL||pEnd==NULL)
return ;
while(pBegin<pEnd)
{
char temp=*pBegin;
*pBegin=*pEnd;
*pEnd=temp;
pBegin++;
pEnd--;
}
}
用这个函数先翻转整个句子,再翻转句子中的每一个单词。
char *ReverseSentence(char *pData)
{
if(pData==NULL)
return NULL;
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”。
分析:把它分成两部分,前两个字符第一部分,后面的字符第二部分。我们分别翻转这两部分,于是得到“bagfedc”。接下来我们再翻转整个字符串,得到“adefgab”。
代码如下:
char* LeftRotateString(char* pStr,int n)
{
if(pStr!=NULL)
{
int nLength=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;
Reverse(pFirstStart,pFirstEnd);
Reverse(pSecondstart,pSecondend);
Reverse(pFirstStart,pSecondend);
}
}
return pStr;
}
测试用例:长度为n的字符左旋转0、1、2、、n-1、n、n+1个字符,字符串为NULL指针