-1

私が試したように、それはArrayIndexOutOfBounds Ecxeptionを与え、最後の文字を出力しません私のコードのバグを見つけるのを手伝ってください。

public static void sequenceCount(String s) {
    int counter;
    int i=0;
    char c;
    char[] arr = s.toCharArray();

    while(i<arr.length){
     counter=0;
      c = arr[i];
    while(c==arr[i]){
        counter++;
        i++;
        }
     System.out.println("letter"+" "+c+":"+"number of times"+counter);
    }
   } 

私はJavaの初心者なので、私のコードは非効率的かもしれません

4

5 に答える 5

2

内側のループは、配列の長さに拘束されません。試す:

while(i < arr.length && c==arr[i]){
    counter++;
    i++;
}
于 2013-03-25T12:12:04.633 に答える
1

これは機能します-内側のループが文字列の終わりを超えないようにする必要があります。また、常に最後の文字もキャッチする必要があります。

public static void sequenceCount(String s) {
    char[] arr = s.toCharArray();
    int i = 0, n = arr.length;

    while (i < n) {
        char c = arr[i];
        int count = 0;
        do {
            ++i; ++count;
        } while (i < n && arr[i] == c);
        System.out.println("letter "+ c +":"+"number of times " + count);
    }
}
于 2013-03-25T12:23:13.183 に答える
1

私のアプローチは、2つのforループを使用することです。

最初のforループは、AからZに相当する10進数のループを実行します。

2番目forのループは、文字配列/文字列全体を実行するループを実行し(ここでは、char配列ではなく文字列を使用します)、そのインデックスで指定された値が最初のループで実行された値と等しいかどうかを確認します。forループ。それらが等しい場合は、1を足して数えます。印刷します。

実行するたびに、カウンターをリセットすることも忘れないでください。

同様のトピックはここにあります:2つのforループを使用して文字列内の文字を数える

于 2013-03-25T13:06:39.207 に答える
0

ここでの答えの多くはO(n ^ 2)ですが、再帰を使用してO(n)時間以内にそれを実行しようとしました。これは私がすでに持っていた既存のコードから変更されているので、メソッドがintを返すことはわかっていますが、使用していません(コピーされたコードから残っています-適切と思われるように修正してください)

public class CountCharSeqRecursive {
    private String test = "AAABBA";  // (3)A(2)B(1)A
    private StringBuilder runningString = new StringBuilder();


    public static void main(String[] args) {
       CountCharSeqRecursive t = new CountCharSeqRecursive();
       System.out.println(t.getEncryptedValue(t.test));
    }

    public String getEncryptedValue(String seq){
        int startIndex=0;
        this.createCounterSeq(seq.charAt(startIndex), seq, startIndex);
        return runningString.toString();
    }

    private int createCounterSeq(char prev, String sequence, int currentIndex){
       return createCounterSeq(prev, sequence, currentIndex, 0);
    }

    private int createCounterSeq(char prev, String sequence, int currentIndex, int count){
        if(currentIndex<sequence.length()){
            char current = sequence.charAt(currentIndex);
          if((prev^current) < 1){
               ++count;
           }else {
                this.addToSequence(count, prev);
                count = 1;
            }
            return count += createCounterSeq(current, sequence, ++currentIndex, count);
        }
        this.addToSequence(count, prev);
        return count;
    }

    private void addToSequence(int count, char ch){
        runningString.append("("+count+")").append(ch);
    }
 }
于 2013-11-20T16:48:52.963 に答える
0

HashSetを使用した私のソリューションは、空でない文字列のすべての場合に機能します。

public static void main(String[] args) {
    // TODO Auto-generated method stub
    HashSet<Character> set = new HashSet<Character>();
    String input = "aabbcdeaab";
    set.add(input.charAt(0));
    int count = 1;
    StringBuilder output = new StringBuilder("");
    for(int i=1;i<input.length();i++) {
        char next = input.charAt(i);
        if(set.contains(next)) {
            count++;
        }else {
            char prev = input.charAt(i-1);
            output.append(Character.toString(prev) + count );
            set.remove(prev);
            set.add(next);
            count=1;
        }
    }
    output.append(Character.toString(input.charAt(input.length()-1)) + count );
    System.out.println(output.toString());
}
于 2018-01-06T21:35:13.940 に答える