2016-12-22 8 views
1

私はCodi​​ngbat.com演習を行っています。私はこの演習で問題が発生しています: 文字列内のすべての 'x'文字に対して、文字列の後のどこかに 'y'文字が存在すれば、文字列はxyバランスされていると言います。だから "xxy"はバランスがとれていますが、 "xyx"はそうではありません。 1つの 'y'は複数のxのバランスをとることができます。指定された文字列がxy-balancedの場合はtrueを返します。次の条件でコードがfalseを返すのはなぜですか?

xyBalance("aaxbby") → true 
xyBalance("aaxbb") → false 
xyBalance("yaaxbb") → false 

私は正しい解決策を知っているが、私は以下のソリューションが動作していない理由として興味があった:

public boolean xyBalance(String str) { 
    for(int i = 0; i < str.length() -1 ;i++) { 
    if(str.indexOf("x") == -1) { 
     return true; 
    } 
    else if(str.charAt(str.length()-1) == 'x') { 
     return false; 
    } 
    else if (str.indexOf("x",i) < str.indexOf("y",i)) { 
     return true; 
    } 
    } 
    return false; 
} 

このコードは例の例のすべてが、2つのために働いている:

xyBalance("y") → true **my code returns false** 

xyBalance("") → true **my code returns false** 

誰かが理由を説明できますか?あなたのおかげ=]

答えて

0

Stringが空の場合、ループは入力されないため、メソッドは自動的にfalseを返します。ループはi = 0で始まり、条件i < str.length() - 1に一致します.Stringが空で自動的に異常終了するため、str.length() - 1が-1と評価されます。

どちらの方法でも、このコードはかなりの計算能力を浪費します。利用できる多くの簡単な解決策があります:何の「X」がString

の最後の「Y」の後に発生しなければ

問題が

Stringに翻訳することができることは、バランスが取れています全体的な問題はずっと簡単になります:

public boolean xyBalanced(String s){ 
    return s.lastIndexOf('x') <= s.lastIndexOf('y'); 
} 
+0

説明してくれてありがとう!私はそれを感謝し、より簡単なソリューションに感謝します。私は初心者です、私はそのことについては一度もありませんでした –

+0

@PiyushKumarが喜んで:) – Paul

0

あなたは文字列"y"ために間違った結果を取得している理由は、forループの条件がi < str.length() -1まで実行することです、修正がされるまで実行するように条件を変更するだろうということです。i < str.length()ので最後の文字を見逃すことはありません。

空の文字列でコードを実行する場合、文字列の長さがゼロであるため、forループに入ることはないため、falseが返されます。実際には良い結果になります。

+0

説明してくれてありがとう! –

関連する問題