簡體   English   中英

如何反轉字符串中的每個字符?

[英]How do i reverse each character in a 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"最新情況如何?

有幾個問題:

  • 您將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();

使用StringBuilder來反轉String中的每個單詞:

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

首先,跳過索引0.將這些行放在方法的末尾以避免這種情況:

count++; 
current = count;

您可能需要一個變量來跟蹤當前單詞的開始位置。 例如,像count和current一樣聲明一個:

int wordStart = 0;

然后,當您處理完一個單詞后,將wordStart設置為指向下一個單詞的第一個字符。 我會把它放在while循環之后,這里:

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

你還需要改變這個: while(current > 0){ to this: while(current >= wordStart)

另外:你不需要數數。 變量i完全相同。

您可以使用stream-api來實現目標:

Stream.of(str.split(" "))
            .map(s -> new StringBuilder(s).reverse().toString())
            .reduce((s1, s2) -> s1 + " " + s2)
            .orElse(null);

這是簡單的方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM