题目
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
- 无空格字符构成一个单词。
- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
题解
解法1
主要思路:根据空格分割原字符串,然后倒叙遍历组合新的字符串。注意处理中间多个空格的场景。
时间复杂度:O(N)
空间复杂度:O(N)
public String reverseWords(String s) {
String[] str = s.trim().split(" ");
StringBuffer sBuffer = new StringBuffer();
for (int i = str.length-1; i >=0; i--) {
if (str[i].length() == 0) continue;
sBuffer.append(str[i]);
sBuffer.append(" ");
}
return sBuffer.length() == 0 ? sBuffer.toString() : sBuffer.substring(0, sBuffer.length()-1).toString();
}
解法2
主要思路:遍历整个字符串,处理空格场景。
- 当字符为空格时,且与上一个空格之间的字符个数为0时,继续遍历;
- 当字符为空格时,且与上一个空格之间的字符个数不为0时,把字符变成字符串放入栈中;
- 当字符不为空格时,放入StringBuffer中;
把字符串依次出栈拼接成新的字符串。
时间复杂度:O(N)
空间复杂度:O(N)
public String reverseWords(String s) {
char[] strChar = s.toCharArray();
Stack<String> stack = new Stack<>();
StringBuffer sBuffer = new StringBuffer();
for (int i = 0; i < strChar.length; i++) {
if (strChar[i] == ' ' && sBuffer.length() == 0) {
continue;
}
if (strChar[i] == ' ' && sBuffer.length() != 0) {
stack.add(sBuffer.toString());
sBuffer = new StringBuffer();
} else {
sBuffer.append(strChar[i]);
}
}
if (sBuffer.length() > 0) {
stack.add(sBuffer.toString());
}
StringBuffer res = new StringBuffer();
while (!stack.isEmpty()) {
res.append(stack.pop());
res.append(" ");
}
return res.length() == 0 ? res.toString() : res.substring(0, res.length()-1).toString();
}