Свернуть массив на PHP
Задача на собеседовании по алгоритмам на программиста PHP
Дан массив целых чисел, повторяющихся элементов в списке нет. Нужно преобразовать его в строку, сворачивая соседние по числовому ряду числа в диапазоны. Примеры:
- [1,4,2,3,9,8,12,0] => "0-4,8-9,12"
- [1,4,5,3,2] => "1-5"
- [3,8] => "3,8"
Ход решения
Для начала надо отсортировать массив по возрастанию. Так как функцией sort() пользоваться нельзя, то необходимо написать свою. Например, пузырьком - самая простая. Дальше проходим по этому отсориторованному массиву и работаем с каждым элементом; логика следующая. Имеем флаг начала диапазона $flag_start, в самом начале он true и когда true, то заносим текущее число обхода в $first_number и ставим количество чисел $count_in = 1.
Сразу обрабатываем последнее число - когда дошли до конца массива. Если количество чисесл больше 2, то ставим тире между ними, иначе - заяпятую. Подразумевается, что количество не меньше двух. Аналогично работаем и с теми элементами массива, у которых следующее не равно текущее плюс 1.
Код решения
//примеры массивов $arr = [1,4,2,3,9,8,12,0]; $arr = [1,4,5,3,2]; $arr = [3,8]; $arr_itog = array();//конечный массив //отсортировать for ($i = 0; $i < count($arr); $i++) { for ($j = $i; $j < count($arr); $j++) { if ($arr[$i] > $arr[$j]){ $temp = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $temp; } } } $flag_start = true; $chet = -1; $count_in = 0; for ($i = 0; $i < count($arr); $i++) { //начало промежутка if ($flag_start){ $chet++; $arr_itog[$chet] = $arr[$i]; $flag_start = false; $first_number = $arr[$i]; $count_in = 1; } //последнее число else if ($i == (count($arr) - 1) ){ if ($count_in > 2){ $arr_itog[$chet] = $first_number."-".$arr[$i]; } else { $arr_itog[$chet] = $arr_itog[$chet].",".$arr[$i]; } } //середина else if (($arr[$i] + 1) == $arr[$i + 1]){ $count_in++; $arr_itog[$chet] = $arr_itog[$chet].",".$arr[$i]; } else { $flag_start = true; if ($count_in > 2){ $arr_itog[$chet] = $first_number."-".$arr[$i]; } else { $arr_itog[$chet] = $arr_itog[$chet].",".$arr[$i]; } } } print_r($arr_itog);//вывод результата
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.