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

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

Статья из группы Архив info.javarush
участников
Кухня(); Задание N50 - 1 Правила [Одномерные массивы] 50. В одномерном массиве переставить элементы так, чтобы сначала располагались отрицательные элементы, потом нулевые, а затем положительные. Относительное расположение элементов не изменять.
Комментарии (10)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Docktor91
Уровень 40
15 сентября 2014, 21:07
//    а вот и одним циклом
public static int[] task50(int... arr)
{
    int len = arr.length;
    int[] res = new int[len];
    for (int i = 0, n = 0, p = len - 1; i < len; i++)
    {
        if (arr[i] < 0)
        {
            res[n++] = arr[i];
        }
        if (arr[len - 1 - i] > 0)
        {
            res[p--] = arr[len - 1 - i];
        }
    }
    return res;
}
aiv
Уровень 27
15 сентября 2014, 21:18
Я что-то подобное тоже хотел сначала сделать, но потом посмотрел на фразу «В одномерном массиве переставить элементы ...» и решил сделать без создания дополнительного массива, поэтому получилось два цикла.
Docktor91
Уровень 40
15 сентября 2014, 21:50
у вас не два, а array.length*array.length это так к слову))
aiv
Уровень 27
15 сентября 2014, 22:30
Не понял. Вы про циклы или про проходы?
Вообще-то циклов 2, а проходов меньше, чем array.length * array.length, т.к. с каждым проходом по первому циклу количество проходов по второму уменьшается на 1. В принципе, это модифицированный пузырьковый метод. Выше я объяснил, почему так сделал — не хотел использовать дополнительный массив, а переставлял элементы в массиве, как написано в задаче.
Docktor91
Уровень 40
15 сентября 2014, 22:52
ой, извиняюсь…
в каждом проходе 1 цикла создается еще один цикл
ИТОГО: array.length+1 циклов))
дружище вас никто не осуждает)
aiv
Уровень 27
15 сентября 2014, 23:04
Как я понял, у нас небольшие непонятки в терминологии. Я считаю циклом программную конструкцию типа for, while (Цикл — разновидность управляющей конструкции в высокоуровневых языках программирования, предназначенная для организации многократного исполнения набора инструкций). А Вы, как я понял циклом называете количество проходов или по другому итераций. Значит нас просто по-разному учили.
Docktor91
Уровень 40
15 сентября 2014, 23:29
ладно, проехали
P.S. цикл это определенный набор проходов, пока не выполнится условие…
т.к. у вас вложенный цикл, я считаю что количество их, циклов, у вас равняется количеству проходов верхнего цикла+верхний цикл
shcho_isle
Уровень 11
18 сентября 2014, 11:38
Круть. Думал, что должно быть красивое решение. И вот оно!
aiv
Уровень 27
15 сентября 2014, 20:04
Можно так:
/**
     * Решение задачи №50 в кухне
     * @param arr исходный массив. Значения в исходном массиве
     *            будут переставлены в сооветствии с заданием.
     */
    public static void changeArray (int[] arr){
        int tmp;

        for (int i = 0; i < arr.length; i++) {

            for (int j = 0; j < arr.length - i - 1; j++) {

                if (((arr[j] == 0) && (arr[j + 1] < 0))
                    || ((arr[j] > 0) && (arr[j + 1] <= 0))) {

                    tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;

                }
            }
        }
    }
shcho_isle
Уровень 11
15 сентября 2014, 17:42

public static int[] task50 (int[] arr){
    int lng = arr.length;
    int[] result = new int[lng];
    int count = 0;
    for (int i = 0; i < lng; i++) {
        if (arr[i] < 0) {
            result[count] = arr[i];
            count++;
        }
    }
    for (int j = 0; j < lng; j++) {
        if (arr[j] == 0) {
            result[count] = arr[j];
            count++;
        }
    }
    for (int k = 0; k < lng; k++) {
        if (arr[k] > 0) {
            result[count] = arr[k];
            count++;
        }
    }
    return result;
}