Сжать массив, удалив из него все элементы, находящиеся в диапазоне [a,b] и заполнить освободившееся элементы нулями. JAVA
public class DeleteArray {
public static void main(String[] args) {
Random rand = new Random();
Scanner scan = new Scanner(System.in);
System.out.println("Введите размер массива - ");
int x = scan.nextInt();
int [] arr = new int[x];
int [] arr1 = null;
System.out.println("Введите значение a - ");
int a = scan.nextInt();
System.out.println("Введите значение b - ");
int b = scan.nextInt();
for (int i = 0;i< arr.length;i++) {
arr[i] = rand.nextInt(10)+5;
}
System.out.println("" + Arrays.toString(arr));
for (int i = 0; i < arr.length; i++) {
if (i>=a && i<=b) {
arr[i] = arr[i+1];
arr[i] = 0;
}
}
System.out.println("" + Arrays.toString(arr));
}
}
Ответы (3 шт):
Автор решения: MBo
→ Ссылка
Вот смотрите (тест на ideone) (исправил скопированную из вопроса ошибку)
int a = 4;
int b = 6;
int[] arr = {5,7,0,1,2,8,4};
int abcount = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i]>=a && arr[i]<=b) //этот элемент не нужен, с ним ничего делать не нужно
abcount++;
else
arr[i-abcount] = arr[i]; //а нужный ставим на финальную позицию
}
for (int i = arr.length - abcount; i < arr.length; i++)
arr[i] = 0;
System.out.println("" + Arrays.toString(arr));
>>[7, 0, 1, 2, 8, 0, 0]
Автор решения: Alex Rudenko
→ Ссылка
В исходном коде на принадлежность диапазону надо проверять значения в массиве, а не его индексы.
Основное здесь - ввести отдельный индекс j последнего корректного элемента, при прохождении массива пропускать числа из исключаемого диапазона, записывая "подходящие" значения по индексу j и инкрементировать его. В конце заполнить хвост нулями, начиная от индекса j (хотя для настоящего сжатия следовало бы скопировать массив в меньший по размеру и отбросить нули).
int j = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] < a || arr[i] > b) { // инвертировать условие
arr[j++] = arr[i]; // перенести число, не входящее в исключаемый диапазон
}
}
while (j < arr.length) {
arr[j++] = 0;
}
System.out.println(Arrays.toString(arr));
результат для a = 7, b = 10;
[0, 9, 9, 10, 10, 11, 0, 11, 6, 8, 12, 10, 6, 7, 11, 6]
[0, 11, 0, 11, 6, 12, 6, 11, 6, 0, 0, 0, 0, 0, 0, 0]
Автор решения: xerx593
→ Ссылка
Попробуйте так (встроил комментарии):
package demo;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;
import java.util.Random;
import java.util.Scanner;
public class DeleteArray {
static final int N = 10;
public static void main(String[] args) {
Random rand = new Random();
Scanner scan = new Scanner(System.in);
// вывод в UTF-8:
PrintStream ps = new PrintStream(System.out, false, StandardCharsets.UTF_8);
ps.println("Границы массива:");
int low = scan.nextInt();
int high = scan.nextInt();
assert (low != high); // проверка параметров!!
if (low > high) { // <- для "чайников"
int tmp = low;
low = high;
high = tmp;
}
// генерируем "массив":
int[] arr = new int[N];
for (int i = 0; i < arr.length; i++) {
// arr(i) := случайное число в [low - high]
arr[i] = rand.nextInt(high - low) + low;
// ... и вывод:
ps.format("%d ", arr[i]);
}
ps.println();
ps.println("Удалить элементы в интервале:");
low = scan.nextInt();
high = scan.nextInt();
// тоже самое:
if (low > high) { // <- для "чайников"
int tmp = low;
low = high;
high = tmp;
}
// инициализация:
int m = N; // "размерность массива", изначально: N
int i = 0; // "курсор"
while (i < m) {// В цикле перебираем элементы массива, начиная с первого.
if (arr[i] <= high && arr[i] >= low) { // При обнаружении элемента, принадлежащего удаляемому интервалу:
// размерность массива уменьшаем на единицу:
m--;
// остальную (правую) часть массива сдвигаем на одну ячейку в лево
for (int j = i; j < m; j++) {
arr[j] = arr[j + 1];
}
} else { // При "не-обнаружении", просто двигаем курсор:
i++;
}
}
// следует заполнить конец массива нулями от элемента с индексом на единицу больше новой размерности массива до количества элементов в «старом» массиве:
for (i = m; i < N; i++) {
arr[i] = 0;
}
// вывод:
for (i = 0; i < N; i++) {
ps.format("%d ", arr[i]);
}
ps.println();
//
}
}
Даст, например:
Границы массива:
-10
10
-4 -2 -4 9 -1 -10 3 -10 1 0
Удалить элементы в интервале:
-3
3
-4 -4 9 -10 -10 0 0 0 0 0