如何反转字符串中的每个字符?

3
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" 到底发生了什么?


提示:你的条件 while(current > 0) 是错误的。尝试打印当前值。 - c2huc2hu
5个回答

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
使用 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);

3
好的,这个方法可行,但是楼主询问的是关于已发布代码的问题,而不是替代方案。 - Pshemo

1

首先,您需要跳过索引0。将这些行放在方法末尾以避免此问题:

count++; 
current = count;

你可能需要一个变量来追踪当前单词的起始位置。例如,可以像这样声明一个变量,与计数和当前变量一起使用:
int wordStart = 0;

然后,当你处理完一个单词时,将wordStart设置为指向下一个单词的第一个字符。我会把它放在while循环之后,就像这样:

build.append(s.charAt(i));
wordStart = count + 1;

你还需要更改这个:while(current > 0){ 为这个:while(current >= wordStart) 此外:你不需要 count。变量 i 是完全相同的东西。

1
你可以使用流 API 来实现你的目标:
Stream.of(str.split(" "))
            .map(s -> new StringBuilder(s).reverse().toString())
            .reduce((s1, s2) -> s1 + " " + s2)
            .orElse(null);

1
.reduce((s1, s2) -> s1 + " " + s2).orElse(null); can be simplified with collect(Collectors.joining(" ")) - Pshemo

-1

这是简单的方法:

return Arrays.stream(s.split(" " ))
        .map(StringBuilder::new)
        .map(StringBuilder::reverse)
        .map(StringBuilder::toString)
        .collect(Collectors.joining(" "));

我删除了我的评论(无法取消踩,因为不是我踩的)。我只会给那些真正回答“我为什么无法理解这个代码为什么不起作用”的答案点赞。如果没有这个问题,这个问题就会成为许多其他问题的重复,比如:使用Java反转“Hello World”字符串中的每个单词 - Pshemo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接