题目一:翻转单词顺序列
牛客最近来了一个新员工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 != "