实现字符串中单词的逆转,即将单词出现的顺序进行逆转。如将"Today is Friday!"逆转为"Friday! is Today"。
思路:不使用额外空间完成,可以分为两步。首先将字符串全部逆转,比如:"Today is Friday!"逆转为"!yadirF si yadoT",然后通过空格分割单词,单词自身进行逆转。
code1:
//Reverse实现一个字符串的全部翻转
void Reverse(char* pb, char* pe)
{
if(pb == NULL || pe == NULL)
return;
while(pb < pe)
{
char temp = *pb;
*pb = *pe;
*pe = temp;
pb++;
pe--;
}
}
//实现字符串中单词整体的逆序
char* ReverseSentence(char* pData)
{
if(pData == NULL)
return;
char* pBegin = pData;
char* pEnd = pData;
while(pEnd != NULL)
pEnd++;
pEnd--;//让pEnd指向字符串最后一个字符
//对pData进行整体翻转
Reverse(pBegin, pEnd);
//然后分别对逆序后的字符串中的每一个单词进行整体翻转
pBegin = pEnd = pData;
while(*pBegin != '\0')
{
if(*pBegin == ' ')
{
pBegin++;
pEnd++;
continue;
}
else if(*pEnd == ' ' || *pEnd == '\0') //对单词进行翻转
{
Reverse(pBegin, --pEnd);
pBegin = ++pEnd;//翻转后记得改变指针指向
}
else
pEnd++;
}
return pData;
}
code2:
//翻转一个字符串
void Reverse(char* str, int start, int end){
if(!str)
return;
char ch;
while(start < end){
ch = str[start];
str[start] = str[end];
str[end] = ch;
start++;
end--;
}
}
//以空格为分隔符,分别对逆序后的字符串中的每个单词再单独逆序
void ReverseSentence(char* str){
if(!str)
return;
int start = 0;
int end = strlen(str);
Reverse(str, 0, end-1);//先整体翻转
int i = 0;
while(i < end){
while(i < end && str[i] != ' ')
i++;
if(i == end){
Reverse(str, start, --i);
break;
}
if(str[i] == ' '){
Reverse(str, start, --i);
start = i + 2;
i += 2;
}
}
}