题目一:翻转单词顺序列
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
测试序列:
1)功能测试(句子中有多个单词、只有一个单词)
2)特殊输入测试(空字符串、字符串中只有空格、)
解题思路:
通过两次翻转字符串(不占用额外的空间)
1)反转句子中所有字符 如"hello world!" 反转后是"!dlrow olleh"
2)再反转每个单词中的字符的顺序 翻转后"world! hello"
class Solution {
public:
string ReverseSentence(string str) {
//string res;
int size = str.size();
if(size==0)
return str;
int pFront = 0;
int pBack = size-1;
ReverseStr(pFront, pBack, str);
//反转每个单词
pBack = 0;
while(pFront < size){
if(str[pFront] ==' '){
pBack = ++pFront; //移到下一个单词的首字母
}else if(str[pBack] ==' ' || pBack ==size){
//找到单词结尾后的空格(或字符串结尾)
ReverseStr(pFront, --pBack, str);
//更新pFront与pBack
pFront = ++pBack;
}else{
pBack++; //寻找单词结尾
}
}
return str;
}
void ReverseStr(int pf, int pb,string &str){
//if(pf==nullptr ||pb==nullptr) //交换的两个指针必须有字符(非空格)
//return;
while(pf<pb){
char temp = str[pf];
str[pf] = str[pb];
str[pb] = temp;
pf++;
pb--;
}
return;
}
};
代码编写不当:不要对string使用string指针!!!直接用下标即可!!!
string *p = &a;
p++; //不知道是什么,总之不是下一个字符!!!
1 class Solution { 2 public: 3 string ReverseSentence(string str) { 4 //string res; 5 int size = str.size(); 6 if(size==0) 7 return str; 8 9 string *pFront = &str; 10 string *pBack = &str; 11 while(*pBack != "