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

时间:2017-12-07 18:22:06

标签: java string

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" 怎么了?

5 个答案:

答案 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(" "));