2014-03-06 55 views
0

我需要在1和0的字符串中打印元素的索引,當且僅當1和0並排重複多次。如何比較單個字符串中的元素?

例如: 輸入: 「0010011」 輸出: 「0,3,5」

甲重複開始於索引0,3和5

這裏是我現在有

Scanner keyboard = new Scanner(System.in); 
    ArrayList runs = new ArrayList(); 


    System.out.println("Enter non empty string of 1s and 0s"); 
    String input = keyboard.nextLine(); 
    char[] array = input.toCharArray(); 

    for(int i = 0; i < input.length(); i++) 
    { 
     if(array[i] == array[i++]) 
     { 
      runs.add(i); 
     } 

    } 
    for(int i = 0; i<= array.length; i++) 
    { 
     System.out.println(runs); 
    } 

當我測試這個,我嘗試輸入「00100」並得到「1,3,5」的輸出。來自「0010011」以上的另一個測試輸入並獲得「1,3,5,7」。它似乎在打印奇數,而不是數字開始重複的索引。任何人都可以發現我做錯了什麼嗎?我有一種感覺,它來自我在第一次循環中的比較。

+0

提示:您如何看待'我++'不會(在'陣列[I ++]')? –

+0

@ZouZou我的印象是,它獲得了我目前所在的前面的下一個元素。 – Reeggiie

+0

@ user3345200不,不幸的不是。 'i ++'返回'i'的值,並在返回後遞增它。 (「後增」) – exception1

回答

1

有3個緊迫的問題,我可以指出:

  • 首先是顯而易見的。您正在使用i++,而您應該使用i + 1i++將增加i的值,因此您錯過了下一次迭代的索引。
  • 其次,您應該重複執行直到input.length() - 2,否則當您訪問最後一個索引的array[i + 1]時,將出現ArrayIndexOutOfBounds異常。
  • 如果您依次超過2個0's1's,您的當前邏輯將失敗。它將打印01索引,例如00010

對於第三點,你應該做的是,一旦你找到兩個連續的字符相同,你應該跳過即將到來的字符相同。你將需要一個內部循環。可能是do-while

你應該修改for循環到這一點:

for(int i = 0; i < input.length() - 1; i++) 
{ 
    if(array[i] == array[i+1]) 
    { 
     System.out.println(i); 
     do { 
      i++; 
     } while (i < input.length() - 1 && array[i] == array[i + 1]); 
    } 
} 

此外,ArrayList沒有length屬性。您應該使用size()方法來獲得最大尺寸。


順便說一句,這也可以使用正則表達式來完成。嗯,你可能沒有被教導這個還沒有,但是這僅僅是另一種可能的方式:

Pattern pattern = Pattern.compile("0{2,}|1{2,}"); 
Matcher matcher = pattern.matcher(input); 

while (matcher.find()) { 
    System.out.println(matcher.start()); 
} 
+0

謝謝你在做的時候額外的一步。我知道這將是一個我不得不考慮的問題。 – Reeggiie

0

兩個問題有:

首先,當後綴++返回值之前生效,所以你是比較陣列[I]與本身。

此外,你正在做兩個加1每個循環,所以只有奇數。

2

這應該工作:

Scanner keyboard = new Scanner(System.in); 

System.out.println("Enter non empty string of 1s and 0s"); 
String input = keyboard.nextLine(); 
char lastChar = '~' 

for(int i=0; i<input.length() - 1; i++) { 
    if(input.charAt(i) == input.charAt(i + 1) && (i == 0 || input.charAt(i) != input.charAt(i - 1))) { 
     System.out.println(i); 
    } 
} 
+0

試試'00100011'。它不會給出預期的結果。 –

+0

@RohitJain固定。不太確定預期的輸出是什麼...... **編輯**:好吧,這應該會產生預期的輸出。 – PlasmaPower

+0

太好了。這將現在工作:) –

-1

試試這個: -

Scanner keyboard = new Scanner(System.in); 
    ArrayList runs = new ArrayList(); 


    System.out.println("Enter non empty string of 1s and 0s"); 
    String input = keyboard.nextLine(); 
    char[] array = input.toCharArray(); 

    for(int i = 0; i < input.length()-1; i++) 
    { 
     if(array[i] == array[i+1]) 
     { 
      runs.add(i); 
     } 

    } 
    for(int i = 0; i<= array.length; i++) 
    { 
     System.out.println(runs); 
    } 
相關問題