2013-03-25 34 views
-1

正如我試過,它給ArrayIndexOutOfBounds Ecxeption並不打印最後字符 請幫助我找到我code.or錯誤是否有任何備用序列計數即假設aabbbaaccd是字符串輸出應該是a = 2,b = 3,a = 2,c = 2,d = 1

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我的代碼可能是低效的

+1

這是一個調試器會在調試代碼有用) – 2013-03-25 12:13:13

+0

可以請你建議我一些調試工具 – Abs 2013-03-25 12:37:54

+0

大多數IDE都有一個調試器。它通常是Run旁邊的按鈕。我使用IntelliJ CE,但Eclipse和Netbeans也具有出色的調試器。 – 2013-03-25 13:03:35

回答

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); 
    } 
} 
+0

謝謝你的糾正 – Abs 2013-03-25 12:34:45

2

你的內環不是由陣列的長度約束。嘗試:

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

感謝你的這個及時的回覆,但條件反向正如提到的assylias – Abs 2013-03-25 12:29:23

1

我的方法是使用兩個for循環。

第一for迴路將運行與A的十進制等價於Z.

環路

第二for迴路將運行穿過整個字符陣列/串運行一個循環(我寧願一個字符串,而而不是char數組),並檢查該索引處的給定值是否等於第一個for循環所運行的值。如果他們等於加一個數。打印。

不要忘記每次運行後重置櫃檯。

類似題目可以在這裏找到:Counting letters in a string using two for-loops

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); 
    } 
} 
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()); 
} 
相關問題