1、遍历+截取(4ms,82%;7.2MB,38%)
1 string reverseWords(string s) { 2 //从后面往前面遍历 3 int len=s.size()-1; 4 string str; 5 while(len>=0){ 6 int sum=0; 7 //排除空格 8 while(len>=0&&s[len]==' ') len--; 9 //定位单词并计算其长度 10 while(len>=0&&s[len]!=' '){ 11 len--; 12 sum++; 13 } 14 if(sum) 15 str+=s.substr(len+1,sum)+" "; 16 } 17 //除掉最后一个空格 18 return str.substr(0,str.size()-1); 19 }
2、没看懂(4ms,82%;7.2MB,38%)
1 string reverseWords(string s) { 2 string s1[1000], s2; 3 int i = 0; 4 stringstream ssin(s); 5 while(ssin>>s1[i]) 6 i++; 7 for(int j = i - 1; j > 0; j--) 8 s2+=s1[j]+" "; 9 s2+=s1[0]; 10 11 return s2; 12 }
3、遍历+截取+翻转(4ms,82%;7MB,57%) 1 string reverseWords(string s) { 2 int len=s.size() 3 int j=0;
4 string str; 5 //用i和j分别指向一个单词的首尾 6 for(int i=0;i<len;i++){ 7 j=i; 8 //跳过单词前的空格 9 while(j<len&&s[j]==' ') j++; 10 //防止最后一次无效执行时多加个空格 11 if(j==len) break; 12 //使其都指向首字母 13 i=j; 14 //使其指向末尾处空格 15 while(j<len&&s[j]!=' ') j++; 16 //该函数翻转【first,last),用于翻转单个单词 17 reverse(s.begin()+i,s.begin()+j); 18 str+=s.substr(i,j-i)+' '; 19 //使其都指向末尾处空格 20 i=j; 21 }
22 reverse(str.begin(),str.end()); 23 //翻转后最后的空格到了第一位 24 return str.substr(1,str.size()); 25 }
4、过程与2类似,但原轨道操作(4ms,82%;6.9MB,69%)
1 string reverseWords(string s) { 2 int k = 0; 3 for(int i = 0; i < s.size(); i++) 4 { 5 int j = i; 6 //跳过单词前的空格 7 while(j < s.size() && s[j] == ' ') j++; 8 //防止最后一次无效操作后多加一个空格 9 if(j == s.size()) break; 10 i = j; 11 while(j < s.size() && s[j] != ' ') j++; 12 reverse(s.begin() + i, s.begin() + j); 13 //补空格 14 if(k) s[k++] = ' '; 15 //翻转后的单词从0开始填充 16 while( i < j) s[k++] = s[i++]; 17 } 18 //删除s.begin() + k到s.end()的剩余字符 19 s.erase(s.begin() + k,s.end()); 20 //end()指向最后一个元素的下一个位置 21 reverse(s.begin(),s.end()); 22 return s; 23 }