题目链接
题目描述:
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: “the sky is blue”
输出: “blue is sky the”
示例 2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
- 无空格字符构成一个单词。
- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
调API
trim
去掉首尾空格;split
按括号内的正则表达式把字符串分割成字符串数组,属于String对象方法;/\s+/
正则表达式,\s
代表空格、+
代表一个或多个;reverse
反转;join
把所有数组中的所有元素放入一个字符串中,并通过括号内的分隔符进行分隔,属于Array对象方法。
代码
/**
* @param {string} s
* @return {string}
*/
var reverseWords = function(s) {
return s.trim().split(/\s+/).reverse().join(" ");
};
利用栈的常规做法
利用stack
模拟整个过程。
- 循环去掉首尾空格,得到左右指针
left
和right
; - 获得完整的字符串
temp
并推入栈中 - 遇到空格就一直循环到再遇见字符为止。
注意:要理清逻辑,注意边界判定问题,不然容易数组越界~
代码
class Solution {
public:
string reverseWords(string s) {
if(s.size() == 0)
return "";
stack<string> record;
int len = s.size();
int left = 0, right = len - 1;
while(left < len && s[left] == ' ')
left++;
while(right >= 0 && s[right] == ' ')
right--;
if(left > right)
return "";
int i = left;
while(i <= right){
if(s[i] == ' '){
while(s[i] == ' ')
i++;
}
else{
string temp = "";
while(i <= right && s[i] != ' '){
temp += s[i];
i++;
}
record.push(temp);
}
}
string result = "";
while(!record.empty()){
result += record.top();
record.pop();
if(!record.empty())
result += ' ';
}
return result;
}
};
参考链接
如果有错误或者不严谨的地方,请务必给予指正,十分感谢。
本人blog:http://breadhunter.gitee.io