剑指 Offer 58 - I. 翻转单词顺序×
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。
1 class Solution { 2 public: 3 //利用容器的方法 4 string reverseWords(string s) { 5 vector<string> vec; 6 string::size_type i = 0, j; 7 while (i < s.size()) 8 { 9 string tmp; 10 while(s[i] == ' ') i++; 11 j = i; 12 while (j < s.size() && s[j] != ' ') j++; 13 /*if (j == s.size() - 1) j++;*/ 14 int len = j - i; 15 if (len == 0) continue; 16 tmp.assign(s, i, len); 17 vec.push_back(tmp); 18 i = i + len; 19 } 20 int left = 0; 21 int right = vec.size() - 1; 22 string tmp; 23 while (left < right) 24 { 25 tmp = vec[left]; 26 vec[left] = vec[right]; 27 vec[right] = tmp; 28 left++; 29 right--; 30 } 31 string res; 32 for (vector<string>::size_type k = 0; k < vec.size(); k++) 33 { 34 string cur; 35 if (k == vec.size() - 1) 36 { 37 cur = vec[k]; 38 } 39 else { 40 cur = vec[k] + ' '; 41 } 42 res.append(cur); 43 } 44 return res; 45 } 46 void reverse(string& s, int start, int end) { //翻转,区间写法:左闭右闭 [] 47 for (int i = start, j = end; i < j; i++, j--) { 48 swap(s[i], s[j]); 49 } 50 } 51 52 void removeExtraSpaces(string& s) {//去除所有空格并在相邻单词之间添加空格, 快慢指针。 53 int slow = 0; //整体思想参考https://programmercarl.com/0027.移除元素.html 54 for (int i = 0; i < s.size(); ++i) { // 55 if (s[i] != ' ') { //遇到非空格就处理,即删除所有空格。 56 if (slow != 0) s[slow++] = ' '; //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。 57 while (i < s.size() && s[i] != ' ') { //补上该单词,遇到空格说明单词结束。 58 s[slow++] = s[i++]; 59 } 60 } 61 } 62 s.resize(slow); //slow的大小即为去除多余空格后的大小。 63 } 64 65 string reverseWords1(string s) { 66 removeExtraSpaces(s); //去除多余空格,保证单词之间之只有一个空格,且字符串首尾没空格。 67 reverse(s, 0, s.size() - 1); 68 int start = 0; //removeExtraSpaces后保证第一个单词的开始下标一定是0。 69 for (int i = 0; i <= s.size(); ++i) { 70 if (i == s.size() || s[i] == ' ') { //到达空格或者串尾,说明一个单词结束。进行翻转。 71 reverse(s, start, i - 1); //翻转,注意是左闭右闭 []的翻转。 72 start = i + 1; //更新下一个单词的开始下标start 73 } 74 } 75 return s; 76 } 77 };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理