亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何有效地對成對數組元素求和并避免在無對數組的情況下出現偏移錯誤?

如何有效地對成對數組元素求和并避免在無對數組的情況下出現偏移錯誤?

PHP
揚帆大魚 2023-08-11 17:16:29
每兩個數組配對就是一項任務——存儲它、打印它并重復它,直到它變成一個值。input : 1, 2, 3, 4, 5, 6, 8, 9, 9output: 3 7 11 17 9        10 28 9        38 9        47 我的代碼在這種情況下運行良好。不知何故,我設法在末尾添加 0 作為成對元素。但我的主要關注點是如何使邏輯更加清晰以避免脾氣暴躁的偏移錯誤?我的代碼:    function sumForTwos($arr) {    if(count($arr) == 1){       exit;    }    else {            $sum = [];            for ($i = 0; $i < count($arr) -1; $i++)             {                   //logic to add last array for odd count to avoid offset error                if(count($arr) % 2 == 1){ $arr[count($arr)] = 0; }                //logic to pair arrays                if($i != 0) {  $i++; }                $sum = $arr[$i] + $arr[$i + 1];                $total[] = $sum;                 echo $sum . " ";             }                 echo "<br>";                $arr = $total;                //Recursion function                sumForTwos($arr);       }} sumForTwos([1, 2, 3, 4, 5, 6, 8, 9, 9]);
查看完整描述

2 回答

?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

您可以采用迭代方法,并將其視為處理每個級別的值,每個下一個級別的總值都會減少 1 個值。換句話說,您可以將其視為逐級進行的廣度優先搜索。因此,您可以使用一種queue?數據結構一次處理每個級別。

您可以使用 PHP 的SplQueue類來實現這一點。請注意,我們可以利用此類,因為它在double-ended queue以下 4 個操作的幫助下充當 a:

  • enqueue- 將值排入隊列末尾。

  • dequeue - 將值從隊列頂部出列。

  • push- 將值推送到雙向鏈表的末尾(這里,隊列是作為雙向鏈表實現的)。

  • pop- 從雙向鏈表的末尾彈出一個節點。

毫無疑問,以上 4 個操作都可以在 O(1) 時間內完成。

算法:

  • 將所有數組元素添加到隊列中。

  • 我們將循環直到隊列大小大于 1。

  • 現在,如果隊列級別大小為奇數,pop則使用最后一個并將其保存在緩沖區中(在變量中)。

  • dequeue通過一次 ing 2來添加所有成對元素,然后enqueue將它們添加到下一個級別。

  • 級別迭代后,如果前一個級別大小為奇數,則添加最后一個元素。

  • 打印這些添加的元素并相應地為每個級別回顯新行。

片段:

<?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]);

查看完整回答
反對 回復 2023-08-11
?
青春有我

TA貢獻1784條經驗 獲得超8個贊

這是你想要的嗎?


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);

    }

}

該算法確保它在偶數數組上運行,然后將奇數條目附加回數組(如果有)。


$input = [1, 2, 3, 4, 5, 6, 8, 9, 9];

pairBySums($input);

產生:


3 7 11 17 9

10 28 9

38 9

47


對于偶數個項目,


$input = [1, 2, 3, 4, 5, 6, 8, 9];

pairBySums($input);

產生:


3 7 11 17

10 28

38


查看完整回答
反對 回復 2023-08-11
  • 2 回答
  • 0 關注
  • 175 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號