题目
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
思路
观察字符串变化规律,你会发现这道题很简单。只需要对每个单词做翻转,然后再整体做翻转就得到了正确的结果。
代码:
//先翻转单词后翻转整体
void RevStr(char *src)
{
char *start = src,*end=src,*ptr=src; //指向头部
while(*ptr++ != '\0') //遍历字符串 应为++后面-2
{
if(*ptr++ ==' '||*ptr=='\0') //找到单词
{
end=ptr-1;
//指向单词末尾
while(start<end)
swap(*start++,*end--); //单词逆序
start=end=ptr+1; //指向下一个单词开头
}
}
start =src,end=ptr-2;
while(start<end)
{
swap(*start++,*end--);
}
}
//先整体后单词
void RevStr(char *src)
{
char *start = src,*end=src,*ptr=src; //指向头部
while(*ptr++ != '\0') //遍历字符串 应为++后面-2
{
end=ptr-2; //末尾字符
while(start<end) //翻转字符串
{
swap(*start++,*end--);
}
char *start = src,*end=src,*ptr=src;
while(*ptr++ != '\0') //遍历字符串 应为++后面-2
{
if(*ptr++ ==' '||*ptr=='\0') //找到单词
{
end=ptr-1; //指向单词末尾
while(start<end)
swap(*start++,*end--); //单词逆序
start=end=ptr+1; //指向下一个单词开头
}
}