0

Java CodeBat 演習を行っています。これが私が立ち往生しているものです

文字列で「zip」や「zap」などのパターンを探します -- 長さ 3 で、「z」で始まり「p」で終わります。そのようなすべての単語の真ん中の文字がなくなった文字列を返します。したがって、「zipXzap」は「zpXzp」になります。

これが私のコードです:

    public String zipZap(String str){

    String s = ""; //Initialising return string
    String diff = " " + str + " "; //Ensuring no out of bounds exceptions occur

    for (int i = 1; i < diff.length()-1; i++) {
        if (diff.charAt(i-1) != 'z' &&
                diff.charAt(i+1) != 'p') {
            s += diff.charAt(i);
        }
    }
    return s;
}

これは、それらのいくつかでは成功しますが、他の人では成功しません。一部のサンプル文字列では、&&演算子が のように動作しているようです。||つまり、保持したい文字の多くが保持されていません。どうやって修正するのかわかりません。

よろしければ、正しい方向に微調整してください。ヒントが欲しい!

4

3 に答える 3

1

これは、正規表現の完璧な使い方のように思えます。

正規表現"z.p"は、az で始まり、途中に任意の文字があり、p で終わる任意の 3 文字のトークンに一致します。文字にする必要がある場合は、"z[a-zA-Z]p"代わりに使用できます。

だからあなたはで終わる

public String zipZap(String str) {
    return str.replaceAll("z[a-zA-Z]p", "zp");
}

ちなみに、これはすべてのテストに合格します。

この質問は生の文字列操作に関するものであると主張することもできますが、それがより良い教訓になると私は主張します: 正規表現を適切に適用することは非常に役立つスキルです!

于 2015-04-07T17:14:38.800 に答える
0
public String zipZap(String str) {
    //If bigger than 3, because obviously without 3 variables we just return the string.
    if (str.length() >= 3)
    {
      //Create a variable to return at the end.
      String ret = "";
      //This is a cheat I worked on to get the ending to work easier.
      //I noticed that it wouldn't add at the end, so I fixed it using this cheat.
      int minusAmt = 2;
      //The minus amount starts with 2, but can be changed to 0 when there is no instance of z-p.
      for (int i = 0; i < str.length() - minusAmt; i++)
      {
        //I thought this was a genius solution, so I suprised myself.
        if (str.charAt(i) == 'z' && str.charAt(i+2) == 'p')
        {
          //Add "zp" to the return string
          ret = ret + "zp";
          //As long as z-p occurs, we keep the minus amount at 2.
          minusAmt = 2;
          //Increment to skip over z-p.
          i += 2;
        }
        //If it isn't z-p, we do this.
        else
        {
          //Add the character
          ret = ret + str.charAt(i);
          //Make the minus amount 0, so that we can get the rest of the chars.
          minusAmt = 0;
        }
      }
      //return the string.
      return ret;
    }
    //If it was less than 3 chars, we return the string.
    else
    {
      return str;
    }
  }
于 2016-12-15T05:04:27.797 に答える