这是一个与问题相关的问题。在 codechef( https://www.codechef.com/problems/FRK ) 上。我不明白为什么我需要将 String 数组的大小增加 1 并运行小于等于(<=)而不是小于(<)的循环来访问数组中的每个元素。
int nooffriends=0;
Pattern p = Pattern.compile("[^A-Za-z0-9.]");
Scanner scan = new Scanner(System.in);
int noofUsers=scan.nextInt();
if(noofUsers<1||noofUsers>5000)
return;
String array[]=new String[noofUsers+1]; //need to increase this size to get correct answer
for(int i=0;i<=noofUsers;i++){ //had to put '<=' instead '<'(why)
array[i]=scan.nextLine();
// if(array[i].charAt(0)<89||array[i].charAt(0)>122)
// return;
Matcher m = p.matcher(array[i]);
if (m.find())
break;
if(array[i].contains("ch")||array[i].contains("he")||array[i].contains("ef"))
nooffriends++;
}
System.out.print(nooffriends);
} }
最佳答案
问题是,当您扫描 nextInt() 时,您不会终止该行。因此,下次调用 nextLine() 实际上会读取输入的同一行。如果检查数组的内容,您将看到 [0] 元素为空。另外,如果您在循环中打印 i,您将看到它允许您在第一个元素上输入,并且跳过 0 个元素。
为了修复它,在 nextInt() 之后添加一个 scan.nextLine() ,它将按预期工作:
System.out.print("Number of users:");
int noofUsers = scan.nextInt();
scan.nextLine(); //Add that!
if (noofUsers < 1 || noofUsers > 5000)
return;
String array[] = new String[noofUsers];
for (int i = 0; i < noofUsers; i++) {
System.out.print("Scan:["+i+"]");
array[i] = scan.nextLine();
Matcher m = p.matcher(array[i]);
if (m.find())
break;
if (array[i].contains("ch") || array[i].contains("he") || array[i].contains("ef"))
nooffriends++;
}
另一个更简单的解决方案是:
for (int i = 0; i <= noofUsers; i++) {
String currentMember=scan.nextLine();
Matcher m = p.matcher(currentMember);
if (m.find())
break;
if (currentMember.contains("ch") || currentMember.contains("he") || currentMember.contains("ef"))
nooffriends++;
}
您不需要将所有答案存储在数组中。您可以只使用当前的操作,然后忘记它;)
关于java - 字符串数组大小和 for 循环访问元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51929065/