Решение циклическим вращением Codility в PHP


Постановка задачи

Ноль-индексированный массив a, состоящий из N целых чисел дано. Вращение массива означает, что каждый элемент сдвигается вправо на один индекс, а последний элемент массива тоже перешла на первое место.

Например, вращение массива = [3, 8, 9, 7, 6] это [6, 3, 8, 9, 7]. Цель состоит в том, чтобы повернуть массива в K раз, то есть каждый элемент будет смещен вправо на индексы к.

Мое Решение

function solution($A, $K) {
   // when array is empty or has only one element 
   if(count($A) == 0 || count($A) == 1){
        return $A;
    }
    //runs k times
    for($j=1; $j<=$K; $j++){
        $last_element = $A[count($A)-1];
        //runs for each element
        for($i=(count($A)-1); $i>0; $i--){
            $A[$i] = $A[$i-1];
        }
        $A[0] = $last_element;  
    }
    return $A;
}

$A = [1, 2, 3, 4];
$K = 4;
$result = solution($A, $K);
print_r($result);

Выход

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)


648
1
задан 16 марта 2018 в 07:03 Источник Поделиться
Комментарии
2 ответа

Вы могли бы использовать функции массива. Они максимально упростить и ускорить обработку массивов. См.: http://php.net/manual/en/ref.array.php

Так что ваш код может стать:

function rotateArray($inputArray,$rightShiftCount)
// shift all elements of the array to the right a number of times
{
// extract the part of the array to move to the front
$partToMove = array_splice($inputArray,-($rightShiftCount % count($inputArray)));
// return extract part followed by what was left of the array
return array_merge($partToMove,$inputArray);
}

Эта функция не проверяет своих доводов, при необходимости можно добавить.

Обратите внимание, что я использовал разумные имена для моих переменных вместо $A и $K. Это является намеренным.

1
ответ дан 17 марта 2018 в 04:03 Источник Поделиться

На самом деле, вам не нужно вращать исходный массив K раз:

<?php

function solution($A, $K)
{
// when array is empty or has only one element
if (count($A) == 0 || count($A) == 1) {
return $A;
}

// The number of rotations needed
$rotateTimes = $K % count($A);

//runs `$rotateTimes` times
for ($j = 1; $j <= $rotateTimes; $j++) {
$last_element = $A[count($A) - 1];
//runs for each element
for ($i = (count($A) - 1); $i > 0; $i--) {
$A[$i] = $A[$i - 1];
}
$A[0] = $last_element;
}
return $A;
}

0
ответ дан 17 марта 2018 в 12:03 Источник Поделиться