0

次のプログラムが正しく動作しません。N文字列内で が検出されるとdursend、 が使用されます.split。次に、1single ごとに a をN収集2し、 N の後に one が続く場合は a などを収集Qします。次に、 の数に0等しい数の を収集する必要がありますQ。正しい出力は 次のようになります。011111120111111201111111111111111最初の出力は0無視されます。私が得る出力は次のとおりです01111112011111201111111111111110。したがって0、最初のプログラムの後に出力した後2、プログラムがうまくいかないようです。11

public class T3 {
  public static void main(String[] args)
  {
    String durs = "NNNNNNNQNNNNNNNQNNNNNNNNNNNNNNNN";
    System.out.println(durs);
    int d = countOccurrencesDurations(durs, 'N');
    int d1 = countOccurrencesDurations(durs, 'Q');
    int m = 32;
    int[] cdn = new int[m];
    int d2;
    StringBuffer sb = new StringBuffer(durs);
    String dursend = sb.append("W").toString();
    String[] a = new String[d];
    a = dursend.split("N");
    // int alen = a.length + d1 - 1;
    // System.out.println("a: " + alen);
    int i = 1;
    while (i < a.length) {
      // System.out.println("N" + a[i]);
      d2 = countOccurrencesDurations(a[i], 'Q');
      // System.out.println(d2);
      int d3 = d2 + 1;
      cdn[i] += d3;
      for (int j = 0; j < d2; j++) {
        i++;
        cdn[i] += 0;
      }
      i++;
    }
    for (int k = 0; k < m; k++) {
      System.out.print(cdn[k]);
    }
  }

  public static int countOccurrencesDurations(String haystack, char needle)
  {
    int count = 0;
    for (int i = 0; i < haystack.length(); i++) {
      if (haystack.charAt(i) == needle) {
        count++;
      }
    }
    return count;
  }
}
4

2 に答える 2

0

この簡略化されたバージョンを試すことができます (実装に多少調整されています)。

StringBuilder sb = new StringBuilder();
char last = 0;
for (char c : durs.toCharArray()) {
    if (c == 'Q' && last == 'N') {
        sb.deleteCharAt(sb.length() - 1);
        sb.append("20");
    } else if (c == 'N') {
        sb.append("1");
    }
    last = c;
}
System.out.println(sb.toString());
于 2013-03-14T22:18:03.140 に答える
0

実用的なソリューションが必要な場合は、これを使用できます。あなたのコメントに従って、ソリューションを更新しました。

public class Main {

    private static String result;

    public static void main(String[] args) {
        String durs = "NNNNNNQQNNNNNNNQNNNNNNNNNNNNNNNN";

        result = "";

        int qCount = 0;
        for(int i = 0; i < durs.length(); i++){
            if (durs.charAt(i) == 'N'){
                // Process accumulated Q's from before
                if (qCount > 0){
                    processQ(qCount);
                    qCount = 0;
                }

                // Do nothing if there is a Q next to us
                if ((i != durs.length() - 1) && durs.charAt(i + 1) == 'Q'){
                    continue;
                }

                result += "1";


            }else{
                qCount++;
            }
        }

        if (qCount > 0){
            processQ(qCount);
        }


        System.out.println(result);
    }

    private static void processQ(int qCount) {
        if (qCount > 0){
            result += (qCount + 1);
            for(int j = 0; j < qCount; j++){
                result += "0";
            }
        }
    }

}

これはうまくいくと思います。

于 2013-03-14T22:15:34.290 に答える