2 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
您可以采用迭代方法,并將其視為處理每個(gè)級(jí)別的值,每個(gè)下一個(gè)級(jí)別的總值都會(huì)減少 1 個(gè)值。換句話說(shuō),您可以將其視為逐級(jí)進(jìn)行的廣度優(yōu)先搜索。因此,您可以使用一種queue
?數(shù)據(jù)結(jié)構(gòu)一次處理每個(gè)級(jí)別。
您可以使用 PHP 的SplQueue
類來(lái)實(shí)現(xiàn)這一點(diǎn)。請(qǐng)注意,我們可以利用此類,因?yàn)樗?code>double-ended queue以下 4 個(gè)操作的幫助下充當(dāng) a:
enqueue
- 將值排入隊(duì)列末尾。dequeue
- 將值從隊(duì)列頂部出列。push
- 將值推送到雙向鏈表的末尾(這里,隊(duì)列是作為雙向鏈表實(shí)現(xiàn)的)。pop
- 從雙向鏈表的末尾彈出一個(gè)節(jié)點(diǎn)。
毫無(wú)疑問(wèn),以上 4 個(gè)操作都可以在 O(1) 時(shí)間內(nèi)完成。
算法:
將所有數(shù)組元素添加到隊(duì)列中。
我們將循環(huán)直到隊(duì)列大小大于 1。
現(xiàn)在,如果隊(duì)列級(jí)別大小為奇數(shù),
pop
則使用最后一個(gè)并將其保存在緩沖區(qū)中(在變量中)。dequeue
通過(guò)一次 ing 2來(lái)添加所有成對(duì)元素,然后enqueue
將它們添加到下一個(gè)級(jí)別。級(jí)別迭代后,如果前一個(gè)級(jí)別大小為奇數(shù),則添加最后一個(gè)元素。
打印這些添加的元素并相應(yīng)地為每個(gè)級(jí)別回顯新行。
片段:
<?php
function sumForTwos($arr){
? ? if(count($arr) == 1){
? ? ? ? echo $arr[0];
? ? ? ? return;
? ? }
? ??
? ? $queue = new SplQueue();
? ??
? ? foreach($arr as $val){
? ? ? ? $queue->enqueue($val); // add elements to queue
? ? }
? ??
? ? while($queue->count() > 1){
? ? ? ? $size = $queue->count();
? ? ? ? $last = false;
? ? ? ? if($size % 2 == 1){
? ? ? ? ? ? $last = $queue->pop(); // pop the last odd element from the queue to make queue size even
? ? ? ? ? ? $size--;
? ? ? ? }
? ? ? ??
? ? ? ? for($i = 0; $i < $size; $i += 2){
? ? ? ? ? ? $first? = $queue->dequeue();
? ? ? ? ? ? $second = $queue->dequeue();
? ? ? ? ? ? echo $first + $second," ";
? ? ? ? ? ? $queue->enqueue($first + $second);
? ? ? ? }
? ??
? ? ? ? if($last !== false){// again add the last odd one out element if it exists
? ? ? ? ? ? echo $last; // echo it too
? ? ? ? ? ? $queue->push($last);?
? ? ? ? }
? ? ? ??
? ? ? ? echo PHP_EOL;// new line
? ? }
? ??
}
sumForTwos([1, 2, 3, 4, 5, 6, 8, 9, 9]);

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊
這是你想要的嗎?
function pairBySums($inputArray)
{
if (sizeof($inputArray) % 2 == 1) {
$lastEntry = array_pop($inputArray); //$inputArray now has even number of elements
}
$answer = [];
for ($ii = 0; $ii < sizeof($inputArray) / 2; $ii++) {
$firstIndexOfPair = $ii * 2; // 0 maps to 0, 1 maps to 2, 3 maps to 4 etc
$secondIndexOfPair = $firstIndexOfPair + 1; // 0 maps to 1, 1 maps to 3, 2 maps to 5 etc
$answer[$ii] = $inputArray[$firstIndexOfPair] + $inputArray[$secondIndexOfPair];
}
if (isset($lastEntry)) {
array_push($answer, $lastEntry);
}
echo implode(' ', $answer) . "<br>";
if (sizeof($answer) > 1) {
pairBySums($answer);
}
}
該算法確保它在偶數(shù)數(shù)組上運(yùn)行,然后將奇數(shù)條目附加回?cái)?shù)組(如果有)。
$input = [1, 2, 3, 4, 5, 6, 8, 9, 9];
pairBySums($input);
產(chǎn)生:
3 7 11 17 9
10 28 9
38 9
47
對(duì)于偶數(shù)個(gè)項(xiàng)目,
$input = [1, 2, 3, 4, 5, 6, 8, 9];
pairBySums($input);
產(chǎn)生:
3 7 11 17
10 28
38
- 2 回答
- 0 關(guān)注
- 176 瀏覽
添加回答
舉報(bào)