Задача на массивы Java
По заданию нужно решить следующую задачу: Дан массив размера N. Вставить элемент с нулевым значением перед минимальным и после максимального элемента массива.
Решил задачу следующим образом:
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] A;
A = new int[n];
int i;
for (i = 0; i < n; ++i) {
A[i] = in.nextInt();
}
int amin = 0, amax = 0;
for (i = 0; i < n; ++i) {
if (A[amin] > A[i]) {
amin = i;
}
if (A[amax] < A[i]) {
amax = i;
}
}
System.out.println("Min = " + A[amin]);
System.out.println("Max = " + A[amax]);
if (amax > amin)
amax++;
n++;
for (i = n - 1; i >= amin; --i)
A[i] = A[i - 1];
A[amin] = 0;
n++;
for (i = n - 1; i > amax + 1; --i)
A[i] = A[i - 1];
A[amax + 1] = 0;
for (i = 0; i < n; ++i)
System.out.print(A[i]);
Но по итогу появляется ошибка переполнения массива (максимальный и минимальный элемент находится верно). Прочитал, что на языке Java массивы не изменяемые и нужно как-то их копировать и создавать новые. Как можно это реализовать и решить эту задачу? Заранее большое спасибо!
Ответы (3 шт):
Автор решения: Anastasiya
→ Ссылка
Юзай ArrayList, а если надо будет переделать в массив:
list.stream().toArray()
Автор решения: Anastasiya
→ Ссылка
//read the values from users input
String[] array = scanner.nextLine().split("\\s+");
//get min number with help of stream api (java 8+)
int min = Arrays.asStream(array)
.mapToInt(Integer::parseInt).min();
//the same as previous but gettin max number
int max = Arrays.asStream(array)
.mapToInt(Integer::parseInt).max();
//create the list
ArrayList<Integer> list = Arrays.asStream(array).collect(Collectors.toList());
//getting indexes
int minIndex=list.indexOf(min);
int maxIndex=list.indexOf(max);
//insert into list by their places
list.add(minIndex, 0);//zero is a number to insert it may be everything
list.add(maxIndex, 0);
//map your list to array
int[] array = list.stream().toArray () ;
Автор решения: Alexandr
→ Ссылка
Вот один из вариантов кода:
package com.somepackage;
import java.util.Arrays;
import java.util.Scanner;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
Scanner in =
new Scanner(System.in);
int n = in.nextInt();
int[] array =
IntStream.range(0, n)
.map(i -> in.nextInt())
.toArray();
int minIndex =
getMaxIndex(array);
System.out.println("Min = " + array[minIndex]);
array = insert(array, minIndex, 0);
int maxIndex =
getMinIndex(array);
System.out.println("Max = " + array[maxIndex]);
array = insert(array, maxIndex + 1, 0);
System.out.println("Result = " + Arrays.toString(array));
}
public static int getMaxIndex(
int[] array) {
return IntStream.range(0, array.length)
.reduce((i, j) -> array[i] > array[j] ? j : i)
.getAsInt();
}
public static int getMinIndex(
int[] array) {
return IntStream.range(0, array.length)
.reduce((i, j) -> array[i] < array[j] ? j : i)
.getAsInt();
}
public static int[] insert(
int[] array,
int index,
int element) {
int[] result =
new int[array.length + 1];
System.arraycopy(
array, 0, result, 0, index);
System.arraycopy(
array, index, result, index + 1, array.length - index);
result[index] = element;
return result;
}
}
Пример:
5
5
4
3
2
1
Min = 1
Max = 5
Result = [5, 0, 4, 3, 2, 0, 1]