一、题目描述:
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 示例 1: 输入:s = "Let's take LeetCode contest" 输出:"s'teL ekat edoCteeL tsetnoc" 示例 2: 输入: s = "God Ding" 输出:"doG gniD" 提示: 1 <= s.length <= 5 * 104 s 包含可打印的 ASCII 字符。 s 不包含任何开头或结尾空格。 s 里 至少 有一个词。 s 中的所有单词都用一个空格隔开。
二、思路分析:
分析题目,注意点如下:
1.反转单词中字母顺序
2.保持原有单词顺序和空格
3.至少 有一个词
根据题目分析, 使用额外的空间,将字符串放入数组中,遍历原有字符串,根据空格把字符串拆分成多个单词的字符串,我们只关心空格字符和最后一个字符,于是,遇到正常的字母字符一概不管;当找到空格时就找到了一个单词, 并将单词的字符串进行反转,然后继续找到下一个单词,最后 将反转的单词字符串拼接起来就是最终答案。
三、AC 代码:
class Solution { public String reverseWords(String s) { char[] chars = s.toCharArray(); int left = 0; for (int i = 0; i < s.length(); i++) { char currentChar = s.charAt(i); if (currentChar == ' ') { reverse(chars, left, i - 1); left = i + 1; } else if (i == s.length() - 1) { reverse(chars, left, i); } } return String.valueOf(chars); } private static void reverse(char[] chars, int start, int end) { while (start < end) { char temp = chars[start]; chars[start] = chars[end]; chars[end] = temp; end --; start ++; } } }
四、总结:
执行结果通过了,但是看内存和执行用时并不是很高,应该还有很多更好的思路,可以多去看看大佬们的题解扩充下思路。