JavaRush/Java блог/Архив info.javarush/Кухня(); Задание N28.
terranum
28 уровень

Кухня(); Задание N28.

Статья из группы Архив info.javarush
участников
Кухня(); Задание N28. - 1 Правила [Одномерные массивы] 28. Дана последовательность действительных чисел a1 ≤ a2 ≤ ... ≤ аn. Вставить действительное число b в нее так, чтобы последовательность осталась неубывающей.
Комментарии (14)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
RabenokDmitry
Уровень 21
16 февраля 2015, 21:47
public static int[] addValue(int[] array, int value) {
        int index = 0;
        // Бросаем исключение, если массив нулевой длины
        if (array.length == 0) {
            throw new IllegalArgumentException("Это не возрастающий массив!");
        }
        // Если значение больше последнго в массиве, то просто вставляем его в конец
        if (value > array[array.length - 1]) {
            array = Arrays.copyOf(array, array.length + 1);
            array[array.length - 1] = value;
            return array;
        }
        // Находим индекс, куда нужно вставить элемент!
        for (int i = 0; i < array.length; i++) {
            if (value >= array[i] && value < array[i + 1]) {
                index = i + 1;
                break;
            }
        }
        // Сдвигаем все вправо относительно index, куда затем вставляем значение
        array = Arrays.copyOf(array, array.length + 1);
        System.arraycopy(array, index, array, index + 1, array.length - 1 - index);
        array[index] = value;
        return array;
    }
terranum
Уровень 28
31 августа 2014, 18:32
Docktor91
Уровень 40
30 августа 2014, 14:07
public static double[] insertIntoArrValue(double value,double... arr)
    {
        double[] res = new double[arr.length + 1];
        int added = 0;
        for (int i = 0; i < arr.length; i++)
        {
            if (added == 0 && value <= arr[i])
            {
                res[i] = value;
                added++;
            }
            res[i + added] = arr[i];
        }
        if (added == 0)
            res[res.length - 1] = value;
        return res;
    }
Docktor91
Уровень 40
30 августа 2014, 16:36
ну если читерить можно так
public static double[] insertIntoArrValue(double value,double... arr)
    {
        double[] res = Arrays.copyOf(arr,arr.length+1);
        res[res.length - 1] = value;
        Arrays.sort(res);
        return res;
    }
Sultan
Уровень 16
30 августа 2014, 16:49
res[res.length — 1] = value;
res[arr.length] = value;
Sultan
Уровень 16
30 августа 2014, 16:50
так короче, люблю оптимизировать, когда это легко.
Docktor91
Уровень 40
30 августа 2014, 17:40
))
Sultan
Уровень 16
30 августа 2014, 13:28
import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            double b = Double.parseDouble(String.valueOf(Math.random() * 10).substring(0, 4));
            double[] arr = generateDoubleArray();
            double[] res = kitchen28(arr, b);

            System.out.println("Test #" + (i + 1));
            System.out.print("arr = ");
            printlnArray(arr);
            System.out.println("b = " + b);
            System.out.print("res = ");
            printlnArray(res);
            System.out.println();
        }
    }

    public static double[] kitchen28(double[] arr, double b) {
        double[] res = new double[arr.length + 1];
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] <= b) {
                res[i] = arr[i];
                if (i == arr.length - 1) {
                    res[i + 1] = b;
                }
            }
            else if (i == 0 || arr[i - 1] <= b) {
                res[i] = b;
                res[i + 1] = arr[i];
            }
            else {
                res[i + 1] = arr[i];
            }
        }
        return res;
    }

    public static double[] generateDoubleArray() {
        int n = (int) (Math.random() * 5) + 3;
        double[] arr = new double[n];
        for (int i = 0; i < n; i++) {
            arr[i] = Double.parseDouble(String.valueOf(Math.random() * 10).substring(0, 4));
        }
        Arrays.sort(arr);
        return arr;
    }

    public static void printlnArray(double[] arr) {
        System.out.print("{ " + arr[0]);
        for (int i = 1; i < arr.length; i++) {
            System.out.print(", " + arr[i]);
        }
        System.out.println(" }");
    }

}
Sultan
Уровень 16
30 августа 2014, 13:37
Или так:
public static double[] kitchen28(double[] arr, double b) {
    double[] res = new double[arr.length + 1];
    int i = 0, j = 0;

    while (i < arr.length && arr[i] <= b) {
        res[j++] = arr[i++];
    }

    res[j++] = b;

    while (i < arr.length) {
        res[j++] = arr[i++];
    }

    return res;
}
Tan4ek
Уровень 20
29 августа 2014, 21:22
public static void func(double[] array, double b) {
    double[] newArray = new double[array.length + 1];
    int position = -1;

    for (int i = 0; i < array.length; i++)
        position = array[i] < b ? i + 1 : position;

    if (position == -1) {
        newArray[0] = b;
        System.arraycopy(array, 0, newArray, 1, array.length);
    } else {
        System.arraycopy(array, 0, newArray, 0, position);
        System.arraycopy(array, position, newArray, position + 1, array.length - position);
        newArray[position] = b;
    }

    array = newArray;
}
terranum
Уровень 28
29 августа 2014, 22:56
Ман, давай проверять!

double[] arr = {0, 1, 2, 3, 5, 8, 9, 12, 18, 19, 22, 55, 98, 155, 246, 1000, 5686};
func(arr, 1.2);
System.out.println(Arrays.toString(arr));
Tan4ek
Уровень 20
29 августа 2014, 23:12
Все в этом
array = newArray;
в теории работать должно. Вот такой метод точно работает
public static double[] func(double[] array, double b) {
    double[] newArray = new double[array.length + 1];
    int position = -1;

    for (int i = 0; i < array.length; i++)
        position = array[i] < b ? i + 1 : position;

    if (position == -1) {
        newArray[0] = b;
        System.arraycopy(array, 0, newArray, 1, array.length);
    } else {
        System.arraycopy(array, 0, newArray, 0, position);
        System.arraycopy(array, position, newArray, position + 1, array.length - position);
        newArray[position] = b;
    }

    return newArray;
}
terranum
Уровень 28
30 августа 2014, 11:20
Кто предложит другие варианты?
Sultan
Уровень 16
30 августа 2014, 12:21
//