Я сделал учебное упражнение (оценивается как легкий), и вопрос здесь, и мой ответ в 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 — $ 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
Других решений пока нет …