#java #arrays #string #loops #integer
#java #массивы #строка #циклы #целое
Вопрос:
У меня есть несколько вопросов к этой программе, которую я создаю, чтобы найти наибольшую сумму последовательных чисел в списке. Имейте в виду, это не то же самое, что поиск наибольшей суммы непрерывных целых чисел в массиве. В принципе, учитывая список для ex. 2, -1, 3,4,9 …. и т.д. До 1 миллиона мне нужно найти наибольшую сумму последовательных чисел (в приведенном выше списке 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");
}
Вот некоторые из вопросов, которые у меня есть
- Почему мой оператор if в методе выдает мне исключение ArrayIndexOutOfBounds?
- В задании указано, что список целых чисел для каждого тестового примера будет приведен в одной строке текста с одним пробелом, разделяющим каждое целое число в списке. Можно предположить, что максимальный размер списка для каждого случая будет 1 000 000 — где и как мне ввести эту проверку для максимального списка из 1 миллиона целых чисел?
Спасибо, это на JAVA, кстати.
ОБНОВЛЕНИЕ: Я разобрался с проблемой выхода массива за пределы. Теперь, когда я распечатываю сумму для примера списка, который я привел здесь, я получаю 0 и -1. Что неверно. Я собираюсь попытаться это выяснить, но если у кого-нибудь есть какие-либо идеи, пожалуйста, дайте мне знать.
Комментарии:
1. когда
i
это максимальное значение, которое может быть,savedNums[i 1]
превысит длину массива2. при чтении строки используйте «line = bf.readLine().substring(0,1000000);» это ограничит длину вашего символа до 1 миллиона, а при создании массива saveNums вы создали массив равной длины числам во входной строке, но вы не добавляете эти числа в массив.
Ответ №1:
В задании указано, что список целых чисел для каждого тестового примера будет приведен в одной строке текста с одним пробелом, разделяющим каждое целое число в списке. Можно предположить, что максимальный размер списка для каждого случая будет 1 000 000 — где и как мне ввести эту проверку для максимального списка из 1 миллиона целых чисел?
Приведенное выше утверждение подсказывает вам предположить, что будет 1 миллион целых чисел, если вам нужно инициализировать массив целых чисел. Но поскольку в вашем случае вы используете String[] numbers = line.split(" ");
, вам не нужно беспокоиться об этом. Но если ваш профессор действительно хотел исключить те строки, которые содержат более 1 миллиона целых чисел, то один из способов — поставить проверку после 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]
, то значение суммы в каждом итеме будет:
Первая итерация:
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