QUESTION:
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: “the sky is blue” 输出: “blue is sky the” 示例 2:
输入: “ hello world! “ 输出: “world! hello” 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 示例 3:
输入: “a good example” 输出: “example good a” 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
无空格字符构成一个单词。 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶:
请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。
EXPLANATION:
这道题在leetcode里也是有的,所以算是比较常见的题目。
思路如下,采用双指针的形式,一个来表示一个单词的start,一个表示一个单词的end。这样就可以标记出一个单词,再将这个单词放在一个字符串的前面,就可以了。
算法:
- 先trims的前后空格
- 将start放在索引0位置,开始往后寻找,找到不是空格的地方,说明是一个单词的开始
- 将end放在start位置,开始往后寻找,找到不是字母的位置,说明单词结束
- 然后将这个单词放在sb的开头位置,并添加上空格
- 持续2-4步骤直到s的结尾
- 去掉结果后面的空格
SOLUTION:
class Solution { public String reverseWords(String s) { s = s.trim(); char[] chars = s.toCharArray(); int start = 0,end = 0; StringBuilder sb = new StringBuilder(); while (end<chars.length){ while (start<chars.length && chars[start]==' ') start++; end = start; while (end<chars.length && chars[end]!=' ') end++; sb.insert(0,s.substring(start,end)+" "); start = end; } return sb.toString().trim(); } }