2017-12-07 10 views
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(); 
} 
} 

なぜこれが機能しないのか理解できません。私は 全体のコードを2回行ったが、問題があるようだ。文字列内の各文字をどのように逆にしますか?

入力:"Let's take LeetCode contest" 私の答え:" s'teL ekat s'teL edoCteeL ekat s'teL " 正解:"s'teL ekat edoCteeL tsetnoc" 起こっていただきましたか!?

+0

ヒント:あなたの状態 'while(current> 0)'が間違っています。現在の値を印刷してみてください – user3080953

答えて

3

いくつかの問題があります。

  • あなたがにcurrentを設定するには現在の位置を返し、次に0を繰り返して文字を追加します。 0になるのではなく、最後の単語が始まるまで繰り返します。代わりに、以前の' '文字まで繰り返します。

  • あなたは' '文字を見た後で何かを追加します。文の終わりにはどうなりますか? iは最後の単語の文字を上書きするため、' '文字がなくなり、最後の単語は追加されません。このケースを処理するには、for-loopの後にいくつかのロジックを追加して、未書き込みの単語があるかどうかを確認し、それを逆に追加する必要があります。

簡単な方法は、いくつかの位置に文字を挿入する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を使用します。

count++; 
current = count; 

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

ニース、これは動作しますが、OPは問題の投稿コードについて尋ねました。 – Pshemo

1

まず、あなたはこれを避けるために、あなたのメソッドの最後に次の行を入れて、インデックス0を飛ばします現在の単語がどこで始まったかを追跡するために変数が必要な場合があります。例えば、このような数と現在と一緒にものを宣言します。

int wordStart = 0; 

を次に、あなたは単語の処理を完了すると、次の単語の最初の文字を指すようにwordStartを設定します。私はここで、whileループの後にそれを置く:これにwhile(current > 0){::また、これを変更する必要があります

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

またwhile(current >= wordStart)

を:あなたは、カウントを必要としません。変数iはまったく同じものです。

-1

これは簡単な方法です:

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

@Pshemoはい、私はそれを認識し、修正しました。 – Bohemian

+0

私は自分のコメントを削除しました(私のものではないので、downvoteを削除することはできません)。私は実際に "これがなぜうまくいかないのか理解できない問題を解決している"という回答のみを上書きしています。 "Hello World"文字列の各単語をJavaで逆順にする](https://stackoverflow.com/q/2441501) – Pshemo

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); 'はcollect(Collectors.joining(" "))で単純化できます。 – Pshemo

関連する問題