Более эффективный способ написания этого PHP-кода и создание экземпляра PHP-массива, похожего на список Python

Я сделал учебное упражнение (оценивается как легкий), и вопрос здесь, и мой ответ в PHP ниже.

function solution($X, $A) {
// write your code in PHP7.0

$inplace = []; # positions in place to our goal, space O(X). Index by position number 0..$X

foreach ($A as $k => $pos) {
# time O(N) - array of N integers

if ($pos <= $X) { # we are only interested in positions within $X
# count positions - but store the first $k key seconds which this position is reached.
# We are not interested in when the second leaf of this same position falls.
if (!isset($inplace[$pos]))  $inplace[$pos] = $k;
}
}

$maxk = -1; # max key value which is the longest time for the needed leaf to fall
for ($i=1; $i <= $X; $i++) {
# go through every position
if (isset($inplace[$i])) {
$tempk = $inplace[$i]; //k seconds for this leaf to fall
$maxk = ($tempk > $maxk) ? $tempk : $maxk;
}
else return -1; # if this position is not set, the leaf does not fall, so we exit
}

return $maxk;
}

Мои вопросы:

1) Есть ли лучший способ написать код? Я сосредоточен на сложности времени и простоте кода, поэтому любые отзывы приветствуются.

2) В этом тренировочный материал — пример, если дан в Python для Защита
считая (А, м)
считать экземпляры массива. Я использовал эту концепцию в своем решении, в PHP, где индекс массива был значением. Есть ли в PHP способ создания массива, как в Python? Я представляю в PHP, я бы использовал Исеть () в моем коде при обработке результата подсчета массива, без создания экземпляра целого массива (m + 1) элементов, или есть ли способ заставить приведенную ниже строку работать в PHP?

count = [0] * (m + 1) # Python code for list (array) instantiation of (m+1) elements.
# How do we do this in PHP?

Спасибо большое!

1

Решение

1) Более простой и эффективный способ написать эту функцию — использовать один для цикла и счетчик. Просто зациклите на 1 — $ X и отслеживайте положение элементов с помощью array_search,

function solution($X, $A){
$p = 0;
for($i=1; $i<=$X; $i++) {
$k = array_search($i, $A);
if($k === false)
return -1;
if($k > $p)
$p = $k;
}
return $p;
}

Даже если array_search медленнее, чем isset это решение намного быстрее (с заданными параметрами) и не создает дополнительного массива для отображения конечных положений.

2) В Python есть отличные инструменты для работы со списками (конкатенация, повторение, понимание и т. Д.), Которые недоступны в PHP и других языках.
Но вы можете достичь чего-то похожего с array_fill, то есть: $count = array_fill(0, $m+1, 0);

Вышеуказанная функция «переведена» на python будет:

def solution(X, A):
p = 0
for i in range(1, X+1):
if i not in A:
return -1
v = A.index(i)
if v > p:
p = v
return p
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]