На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

Свернуть массив на 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, задачи, собеседование





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




Вытаскиваем исходник C# из exe-файла
Роман "Работа во сне": Глава №1


© upread.ru 2013-2022
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.