Свернуть массив на 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Программы на заказ
Отзывы
Контакты