Свернуть массив на 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"
Пользоваться можно только if-else, for, count


Ход решения

Для начала надо отсортировать массив по возрастанию. Так как функцией 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, php, задачи, собеседование




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Введение в нейронные сети
Работа с FTP на PHP
Услуги программиста для сайта