class Solution {
public String reverseWords(String s) {
int count = 0;
int current = 0;
StringBuilder build = new StringBuilder();
for(int i = 0; i< s.length(); i++){
count++;
current = count;
if(s.charAt(i) == ' '){
while(current > 0){
build.append(s.charAt(current - 1));
current--;
}
build.append(s.charAt(i));
}
}
return build.toString();
}
}
我无法理解为什么这不起作用。我经历了 整个代码几次,但似乎有一个问题。
输入:"Let's take LeetCode contest"
我的回答:" s'teL ekat s'teL edoCteeL ekat s'teL "
正确答案:"s'teL ekat edoCteeL tsetnoc"
怎么了?
答案 0 :(得分:3)
有几个问题:
您将current
设置为当前位置,然后向下迭代到0追加字符。而不是下降到0,你迭代直到最后一个单词的开头。替代方案,迭代直到上一个' '
字符。
您只能在看到' '
字符后附加内容。在句子结尾会发生什么?当i
越过最后一个单词中的字母时,将不再有' '
个字符,因此最后一个单词永远不会被追加。要处理这种情况,你需要在for循环之后添加一些逻辑来检查是否存在未写入的单词,并将其反转。
更简单的方法是利用StringBuilder
在某个位置插入字符的能力。
您可以跟踪当前单词的开始位置,
当你迭代字符时,
如果它不是' '
,则插入,
或者附加一个' '
并重置插入位置。
StringBuilder build = new StringBuilder();
int current = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == ' ') {
build.append(' ');
current = i + 1;
} else {
build.insert(current, c);
}
}
return build.toString();
答案 1 :(得分:1)
使用StringBuilder来反转字符串中的每个单词:
String input = "Let's take LeetCode contest";
String[] split = input.split(" +");
StringBuilder output = new StringBuilder();
for (int i = 0; i < split.length; i++) {
output.append(new StringBuilder(split[i]).reverse());
if(i<input.length()-1)
output.append(" ");
}
System.out.println(output);
答案 2 :(得分:1)
首先,跳过索引0.将这些行放在方法的末尾以避免这种情况:
count++;
current = count;
您可能需要一个变量来跟踪当前单词的开始位置。例如,像这样声明一个count和current:
int wordStart = 0;
然后,当您处理完一个单词后,将wordStart设置为指向下一个单词的第一个字符。我会把它放在while循环之后,这里:
build.append(s.charAt(i));
wordStart = count + 1;
您还需要将此更改为while(current > 0){
:while(current >= wordStart)
另外:你不需要数。变量i完全相同。
答案 3 :(得分:1)
您可以将stream-api用于您的目标:
Stream.of(str.split(" "))
.map(s -> new StringBuilder(s).reverse().toString())
.reduce((s1, s2) -> s1 + " " + s2)
.orElse(null);
答案 4 :(得分:-1)
这是一种简单的方法:
return Arrays.stream(s.split(" " ))
.map(StringBuilder::new)
.map(StringBuilder::reverse)
.map(StringBuilder::toString)
.collect(Collectors.joining(" "));