对于要在列表中找到最大连续数字的程序,我有一些疑问。请注意,这与在数组中找到最大的连续整数之和不同。基本上,给出了一个清单。 2,-1,3,4,9 ....最多一百万,我需要找到最大的连续数之和(在上面给出的列表中,3,4是连续的,因此总和为7)。所以我能理解的是,我需要一个遍历列表的循环,并检查数字是否连续。我的循环基于这样一个事实,即连续数字相减时等于-1,但是我的if语句似乎总是出现ArrayINdexOutOfBounds错误。举个例子,假设列表是
1 2 3 4
3 -1 4 5
这是我的代码;
public class ProgramCRedo {
//This method reads each line and checks for the largest sum of consecutive numbers in a list
//This method does not have a return value, information is outputted once it exists
//This method has one parameter, it is string list taken from the input file
public static void checkLine (String line){
String[] numbers = line.split(" ");
int sum = 0;
int largestSum = 0;
int [] savedNums = new int [numbers.length];
for(int i = 0; i<savedNums.length; i++) { //loops through the list
savedNums [i] = Integer.parseInt(numbers[i]);
if((savedNums[i] - (savedNums[i+1])) == -1) { //checks if numbers are consecutive
sum += (savedNums[i] + (savedNums[i+1])); //if true, adds them up to a sum
}
System.out.println(sum);
// System.out.println(savedNums[i]);
}
}
}
public static void main(String[] args) {
try{
BufferedReader bf = new BufferedReader (new FileReader("input.txt"));
String line;
line = bf.readLine(); //reads line
//String line1= null; //skips first line
while(line != null){ //keeps looping until no more lines
checkLine(line); // uses list to check each line in file
line = bf.readLine();
}
bf.close();
}catch(FileNotFoundException e){ // catches exceptions
System.out.println("FILE NOT FOUND!");
}catch(IOException e){
System.out.println("Reading Error!");
}catch(NumberFormatException e) {
System.out.println("Invalid Input Entered");
}
System.out.println("Program is complete");
}
这是我的一些问题
谢谢,这是JAVA btw中的内容。
更新:我发现了数组超出范围的问题。现在发生的是,当我打印出此处给出的列表示例的总和时,得到0和-1。这是不正确的。我将尝试找出原因,但是如果有人有任何想法,请告诉我。
答案 0 :(得分:0)
该作业指出,每个测试用例的整数列表将在一行文本中给出,并用一个空格分隔列表中的每个整数。您可以假设每种情况的最大列表大小为1,000,000-在哪里以及如何输入此检查以获取最大100万个整数的列表?
以上语句告诉您假设如果需要初始化整数数组,将有100万个整数。但是由于您使用的是String[] numbers = line.split(" ");
,因此无需担心。但是,如果您的教授真的想排除那些超过一百万个整数的行,那么一种方法是在String[] numbers = line.split(" ");
之后进行检查(有关详细信息,请参见下面的代码)
现在发生的是,当我打印出此处给出的列表示例的总和时,得到0和-1。这是不正确的。我将尝试找出原因,但是如果有人有任何想法,请告诉我。
发生上述声明是因为您的代码对于此行永远是不正确的:
if((savedNums[i] - (savedNums[i+1])) == -1) {
该条件永远不会评估为true
,因为您只是通过执行savedNums
来初始化int [] savedNums = new int [numbers.length];
,这意味着如果numbers.length
为3,则您的savedNums
将会是[0, 0, 0]
,因为int数组的默认值为0。
仅在设置savedNums
来循环时,才设置savedNums [i] = Integer.parseInt(numbers[i]);
的每个元素的值,因此savedNums[i+1]
始终为0。
也进行sum += (savedNums[i] + (savedNums[i+1]));
是不正确的,因为某些元素将在sum
中添加两次。
例如,如果您有savedNums = [1, 2, 3]
,则每个ite中的总和的值为:
第一次迭代:
i = 0;
sum = 0; // initial
sum = sum + savedNums[i] + savedNums[i+1];
sum = 0 + 1 + 2;
sum = 3;
第二次迭代:
i = 1;
sum = 3; // value after first iteration
sum = sum + savedNums[i] + savedNums[i+1];
sum = 3 + 2 + 3; // 2 was added twice
sum = 8;
因此,您的sum
将是8,而不是6。
我已经修改了您的代码,使其可以按预期工作,只需阅读代码注释即可 有关详细信息。
public static void checkLine(String line) {
String[] numbers = line.split(" ");
if (number.length > 1000000) { //if line contains more than 1 million integers
return;
}
int sum = 0;
int largestSum = 0;
for (int i = 0; i < numbers.length - 1; i++) { // loops through the list
int currentNum = Integer.parseInt(numbers[i]);
int nextNum = Integer.parseInt(numbers[i + 1]);
if (nextNum - currentNum == 1) { // checks if numbers are consecutive
// check if sum is 0, which means that this is the first time a consecutive
// number is found
// example [1,2,3,4]
if (sum == 0) { // this will be true when currenNum is 1 and nextNum is 2
sum = currentNum + nextNum; // since it is the first time a consecutive number is found add both
// numbers
} else { // this will be executed when currenNum is 2 and nextNum is 3
sum += nextNum; // since it is not the first time a consecutive number is found only add the
// next number, no need to add the current number since it is already added in
// the above condition
}
} else {
sum = 0;
}
if (largestSum < sum) {
largestSum = sum;
}
}
System.out.println(sum);
}
样本输入:
1 2 3 4
3 -1 4 5
1 2 4 5
输出:
10
9
9