2014-03-06 30 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); 
    } 
相关问题