📝题目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue" 输出: "blue is sky the"
示例 2:
输入: " hello world! " 输出: "world! hello" 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example" 输出: "example good a" 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
|
📝思路
毫不费力的思路:分割出单词->反向拼接
可以用很多方式完成。Java支持库函数split()可以直接以空格为分隔符拆解,trim()筛掉前后空格,几行代码搞定;C++选手可以用stringstream或者手动实现分割拼接,据说此题的出题目的是考察双指针操作字符数组…
我用的正则表达式辅助实现分割,vector容器实现反向拼接…总之题目不是很难,但是手动实现时难免踩到很多坑🤦♀️
官方思路和题解请戳此😃
📝题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| string reverseWords(string s) { vector<string> words; int len = s.size(); string tmp = ""; regex reg("[ ]*"); for (int i = 0; i < len; ++i){ if (regex_match(tmp, reg)) tmp = ""; if (s[i] == ' ' && !regex_match(tmp, reg)){ words.push_back(tmp); tmp = ""; } else { tmp += s[i]; } } if (!regex_match(tmp, reg)) words.push_back(tmp);
int len2 = words.size(); if (len2 == 0) return ""; string temp = ""; for (int i = 0; i < len2-1; ++i){ temp += words.back(); temp += " "; words.pop_back(); } temp += words.back(); return temp; }
|