序列计数,即假设aabbbaaccd是字符串输出应该是a = 2,b = 3,a = 2,c = 2,d = 1

时间:2013-03-25 12:10:22

标签: java string

正如我所尝试的,它给出了ArrayIndexOutOfBounds Ecxeption并且不打印最后一个char 请帮我查一下我的代码中的错误。还有其他的

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的新手,我的代码可能效率低下

5 个答案:

答案 0 :(得分:2)

您的内部循环不受数组长度的约束。尝试:

while(i < arr.length && c==arr[i]){
    counter++;
    i++;
}

答案 1 :(得分: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);
    }
}

答案 2 :(得分:1)

我的方法是使用两个for循环。

第一个for循环将运行一个循环,其等效值为A到Z.

第二个for循环将运行一个遍历整个字符数组/字符串的循环(我更喜欢这里的字符串而不是字符数组)并检查该索引处的给定值是否为等于第一个for循环运行的值。如果它们等于加一个来计数。打印。

每次运行后都不要忘记重置计数器。

可以在此处找到类似的主题:Counting letters in a string using two for-loops

答案 3 :(得分: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);
    }
 }

答案 4 :(得分: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());
}