В вашем коде есть ошибка: numbers[n-1]
вполне может содержать второе по величине число. Вы перезаписываете это число самым большим числом в своем коде, прежде чем пытаться поставить его с первой на последнюю позицию.
Один из способов преодолеть это - отсортировать массив, используя Arrays.sort
, таким образом, вы уверены, что последние два числа являются старшим, а второе - самым высоким числом.
public static long multiplyLargestTwoNumbers(long[] numbers) {
long[] sortedNumbers = numbers.clone();
Arrays.sort(sortedNumbers);
int size = numbers.length;
// multiply highest and second highest number
return sortedNumbers[size - 1] * sortedNumbers[size - 2];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long numbers[] = new long[n];
for (int i = 0; i < n; i++) {
numbers[i] = sc.nextLong();
}
System.out.println(multiplyLargestTwoNumbers(numbers));
}
Другие изменения:
- с использованием
long
вместо Long
: попробуйте использовать примитивные типы, когда объективные ссылочные типы не нужны (вам нужно Long
, если вы хотите использовать, например, List
, потому что List
может содержать только ссылки на объекты);
- разнесены
for
петли, пожалуйста, используйте пробел;
- переименованный метод, поскольку он ничего не добавляет попарно;
- использовались фигурные скобки для
for
цикла в основном методе;
- удалены ложные скобки в части, которая выполняет умножение.
Вы также можете ввести оператор if
, который сначала проверяет, действительно ли массив numbers
содержит хотя бы два элемента. Это называется охранное заявление .
Наконец, помните, что byte
, short
и long
все содержат числа со знаком определенного размера. В основном вы выполняете вычисления модуль 2 ^ n , где n - размер бита. Если значение слишком велико, оно может переполниться и вернуть неверный результат. Для этого вам нужно BigInteger
.