На нашем сайте мы используем 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, задачи





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




Слово "status" и MySQL
Алгоритм XOR-обмена на C#


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