力扣151、翻轉字串裡的單詞
阿新 • • 發佈:2021-10-04
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 strings1[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
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 }