「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战」
题目分析
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
- 示例 1:
输入:"Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"
- 在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。
根据题意可知,我们只需要将每个单词或词组进行翻转,而每个单词之间是用空格隔开,所以有个简单的思路,就是通过空格将单词分割,然后对每个单词进行翻转。所以我们可以有以下几个步骤完成:
- 通过split将字符串分割成数组;
- 遍历数组,使用reverse翻转每个单词;
- 使用sb1拼接分割后的字符串;
- 删除拼接完成时最后一个多余空格。
复杂度分析:
时间复杂度:O(N),其中 N 为字符串的长度。
代码分析
class Solution {
public String reverseWords(String s) {
StringBuffer sb1 = new StringBuffer();
String[] strArr = s.split(" ");
for(String str : strArr){
StringBuilder sb2 = new StringBuilder(str);
sb1.append(sb2.reverse().toString()).append(" ");
}
sb1.deleteCharAt(sb1.length() - 1);
return sb1.toString();
}
}
复制代码
执行结果:通过
执行用时:4 ms, 在所有 Java 提交中击败了82.02%的用户
内存消耗:38.9 MB, 在所有 Java 提交中击败了74.55%的用户
这里可以参考官网的解法:
开辟一个新字符串。然后从头到尾遍历原字符串,直到找到空格为止,此时找到了一个单词,并能得到单词的起止位置。
随后,根据单词的起止位置,可以将该单词逆序放到新字符串当中。
如此循环多次,直到遍历完原字符串,就能得到翻转后的结果。
class Solution {
public String reverseWords(String s) {
StringBuffer ret = new StringBuffer();
int length = s.length();
int i = 0;
while (i < length) {
int start = i;
while (i < length && s.charAt(i) != ' ') {
i++;
}
for (int p = start; p < i; p++) {
ret.append(s.charAt(start + i - 1 - p));
}
while (i < length && s.charAt(i) == ' ') {
i++;
ret.append(' ');
}
}
return ret.toString();
}
}
复制代码
\
近期评论