当且仅当1和0并排重复多次时,我需要以1s和0s的字符串打印元素的索引。
例如: 输入:“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”。它似乎是打印奇数,而不是数字开始重复的索引。谁能发现我做错了什么?我感觉它来自我在第一个for循环中的比较。
答案 0 :(得分: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);
}
}
答案 1 :(得分:1)
我可以指出有三个直接问题:
i++
,而您应该使用i + 1
。 i++
会增加i
的值,因此您错过了下一次迭代的索引。input.length() - 2
,否则当您访问最后一个索引的ArrayIndexOutOfBounds
时,您将获得array[i + 1]
例外。0's
或1's
,您当前的逻辑将失败。它会打印0
和1
索引,例如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());
}
答案 2 :(得分:0)
那里有两个问题:
首先,当postfix ++
在生效前返回值时,您将array [i]与其自身进行比较。
另外,你每个循环都做两个加1,所以只有奇数。
答案 3 :(得分:-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);
}