Чат PHP-разработчиков
Циклический сдвиг вправо на n на PHP

Циклический сдвиг вправо на n

Эта задача похожа на предыдущую, но несколько более сложная. Хорошее решение не так очевидно, как кажется на первый взгляд.

Теперь нужно написать функцию, которая циклически сдвинет элементы массива вправо n раз. То есть мы передаём в функцию два аргумента: массив и число n. Она должна вернуть массив после n операций сдвига.

Интерфейс, которому должна соответствовать функция:

function shiftToRight(array $array, int $n): array

Обратите внимание, что если у вас массив из трех элементов, а сдвинуть надо 5 раз, то мы сдвинем 3 раза и получим исходный массив, а потом еще сдвинем на 2. То есть после 5 сдвигов, результат будет тот же, как после 2! Учитывайте это при решении - чем меньше операций произойдет внутри функции, тем лучше.

Решение

Присоединяйтесь к нам в ВКонтакте и в Facebook, чтобы не пропустить новые уроки. А также вступайте в наш чат PHP-разработчиков в Telegram.
Читайте также
Комментарии (8)


EWA

<?php
function shiftToRight(array $array, int $n): array
{
    $x = count($array);

    if($n > $x){
        $n -= $x;
    }

    if($n == $x){
        return $array;
    }

    if($n < $x){
    for($i = 1; $i <= $n; $i++){
        $last = array_pop($array);
        array_unshift($array, $last);

    }
    return $array;
    }
}
?>
ilyaOrlov
<?php

function shift(array $array, int $n): array
{
    for ($count = 0; $count < $n ; $count ++) { 
        $tmpNum = array_pop($array);
        array_unshift($array, $tmpNum);
    }
    return $array;
}

?>
den
function shiftToRight(array $array, int $n): array
{
    $shift = count($arr) % $n;
    if ($shift !== 0) {
        for($i = 0; $i < $shift; $i++) {
            $lastElement = array_pop($array);
            array_unshift($array, $lastElement);
        }
    }
    return $array;
}
ivashkevich

Во, остаток от деления подъехал. Неплохо! =)

den

да, а про array_splice() забыл)

virtual2018
function shiftArrayRight(array $array, int $n) : array 
{
    $countOfArray = count($array);
    if ($n == $countOfArray)
        return $array;
    if ($n > $countOfArray) {
        $n = $n - $countOfArray;
    }
    if ( $countOfArray / 2 > $n) {
        list($arrayTempFirst, $arrayTempSecond) = array_chunk($array, $countOfArray - $n);
        return array_merge($arrayTempSecond, $arrayTempFirst);
    }
    else {
        list($arrayTempFirst, $arrayTempSecond) = array_chunk(array_reverse($array), $n);
        return array_merge(array_reverse($arrayTempFirst), array_reverse($arrayTempSecond));
        }
}
virtual2018

вариант 2

function shiftArrayRight(array $array, int $n) : array
{
    $countOfArray = count($array);
    if ($n == $countOfArray)
        return $array;
    if ($n > $countOfArray) {
        $n = $n - $countOfArray;
    }
    if ( $countOfArray / 2 > $n) {
        return array_merge(array_slice($array, $countOfArray - $n, $countOfArray - $n), array_slice($array, 0, $countOfArray - $n));
    }
    return array_merge(array_slice($array, $countOfArray - $n, $n), array_slice($array, 0, $countOfArray - $n));
}
tmv.nika@mail.ru
<?php
function shiftToRight(array &$array, int $n)
{
    if (count($array) > $n) {
        for ($i=1; $i <= $n; $i++) {
    $first = array_shift($array);
    $array[] = $first;}
}
        else {
            $x = count($array) - $n;
            for ($i = 1; $i <= $n; $i++)
            {
                $first = array_shift($array);
                $array[] = $first;
            }
        }
}

$array = [0,1,2,3,4,5,6,7,8,9];
shiftToRight($array, 11);
var_dump($array);
Популярное за сутки
Сейчас читают
Логические задачи с собеседований