-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

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

第一个for循环将运行一个循环,其十进制等效于 A 到 Z。

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

不要忘记在每次运行后重置您的计数器。

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

于 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 回答