Heim  >  Artikel  >  Backend-Entwicklung  >  Bitte helfen Sie mir mit diesem einfachen Algorithmus

Bitte helfen Sie mir mit diesem einfachen Algorithmus

WBOY
WBOYOriginal
2016-09-19 09:16:25999Durchsuche

Der Text ist nicht gut, bitte verbessern Sie ihn
Eine Reihe von Benutzer-IDs

<code>$uids = [1,2,3,5,6,8,9,11,13,25,65];</code>

Jeder Schlüsselwert in diesem Array stellt eine UID dar
Betragsarray

<code>$amounts = [
    1=>12000,
    2=>500,
    3=>11000,
    5=>1000,
    6=>11000,
    8=>12000,
    9=>12000,
    11=>11000,
    13=>12000,
    25=>22000,
    65=>123123
];</code>

Der Schlüsselname dieses Arrays entspricht dem Schlüsselwert des $uid-Arrays.
Durchlaufen Sie das $uids-Array und entnehmen Sie den entsprechenden Betrag $amount.
Wenn der Betrag größer oder gleich 12000 ($boundary) ist, addieren Sie den $amount zum Gesamtbetrag ($totals)
Wenn der Betrag weniger als 12.000 beträgt, führen Sie eine Abwärtsschleife durch, bis die Summe dieser $-Beträge größer oder gleich 12.000 ist. Addieren Sie dann die Summe dieser $-Beträge zum Gesamtbetrag ($totals)
und nehmen Sie bis auf drei Ebenen.
Ermitteln Sie endlich den Wert von $totals.
Mein aktueller Code:

<code><?php
$boundary = 12000;
$uids= [1,2,3,5,6,8,9,11,13,25,65];
$amounts = [
    1=>12000,
    2=>500,
    3=>11000,
    5=>1000,
    6=>11000,
    8=>12000,
    9=>12000,
    11=>11000,
    13=>12000,
    25=>22000,
    65=>123123
];
$totals = 0;
foreach($uids as $k => $uid){
    $amont = $amounts[$uid];
    if($amont >= $boundary){
        $totals += $amont;
    }else{
        $next = get_next($uids ,$k+1 ,$amont);
        if($next && is_array($next)){
            $curKey = $next[0]; //amouts index 3
            $totals+=$next[2];
            //再向下获取一层
            $nextKey = $curKey+1;
            if(!isset($uids[$nextKey])){
                break;
            }
            $nextUid = $uids[$nextKey];
            $nextAmount = $amounts[$nextUid];
            if($nextAmount >= $boundary){
                $totals+=$nextAmount;
            }else{
                $last = get_next($uids ,$nextKey+1 ,$nextAmount);
                if($last && is_array($last)){
                    $totals+=$last[2];
                }
            }
        }
        break; //跳出主循环
    }
}
echo $totals;
exit;

function get_next($uids ,$start ,$prevAmount){
    global $amounts ,$boundary;
    $leaves = array_slice($uids ,$start ,count($uids),true);
    if($leaves){
        foreach($leaves as $k=>$uid){
            $amount = $prevAmount+$amounts[$uid];
            if($amount >= $boundary){
                return [$k ,$uid ,$amount];
                break;
            }else{
                return get_next($uids ,$k+1 ,$amount);
            }
        }
    }
    return 0;
}</code>

Erhalten Sie insgesamt $47500

Antwortinhalt:

Der Text ist nicht gut, bitte verbessern Sie ihn
Eine Reihe von Benutzer-IDs

<code>$uids = [1,2,3,5,6,8,9,11,13,25,65];</code>

Jeder Schlüsselwert in diesem Array stellt eine UID dar
Betragsarray

<code>$amounts = [
    1=>12000,
    2=>500,
    3=>11000,
    5=>1000,
    6=>11000,
    8=>12000,
    9=>12000,
    11=>11000,
    13=>12000,
    25=>22000,
    65=>123123
];</code>

Der Schlüsselname dieses Arrays entspricht dem Schlüsselwert des $uid-Arrays.
Durchlaufen Sie das $uids-Array und entnehmen Sie den entsprechenden Betrag $amount.
Wenn der Betrag größer oder gleich 12000 ($boundary) ist, addieren Sie den $amount zum Gesamtbetrag ($totals)
Wenn der Betrag weniger als 12.000 beträgt, führen Sie eine Abwärtsschleife durch, bis die Summe dieser $-Beträge größer oder gleich 12.000 ist. Addieren Sie dann die Summe dieser $-Beträge zum Gesamtbetrag ($totals)
und nehmen Sie bis auf drei Ebenen.
Ermitteln Sie endlich den Wert von $totals.
Mein aktueller Code:

<code><?php
$boundary = 12000;
$uids= [1,2,3,5,6,8,9,11,13,25,65];
$amounts = [
    1=>12000,
    2=>500,
    3=>11000,
    5=>1000,
    6=>11000,
    8=>12000,
    9=>12000,
    11=>11000,
    13=>12000,
    25=>22000,
    65=>123123
];
$totals = 0;
foreach($uids as $k => $uid){
    $amont = $amounts[$uid];
    if($amont >= $boundary){
        $totals += $amont;
    }else{
        $next = get_next($uids ,$k+1 ,$amont);
        if($next && is_array($next)){
            $curKey = $next[0]; //amouts index 3
            $totals+=$next[2];
            //再向下获取一层
            $nextKey = $curKey+1;
            if(!isset($uids[$nextKey])){
                break;
            }
            $nextUid = $uids[$nextKey];
            $nextAmount = $amounts[$nextUid];
            if($nextAmount >= $boundary){
                $totals+=$nextAmount;
            }else{
                $last = get_next($uids ,$nextKey+1 ,$nextAmount);
                if($last && is_array($last)){
                    $totals+=$last[2];
                }
            }
        }
        break; //跳出主循环
    }
}
echo $totals;
exit;

function get_next($uids ,$start ,$prevAmount){
    global $amounts ,$boundary;
    $leaves = array_slice($uids ,$start ,count($uids),true);
    if($leaves){
        foreach($leaves as $k=>$uid){
            $amount = $prevAmount+$amounts[$uid];
            if($amount >= $boundary){
                return [$k ,$uid ,$amount];
                break;
            }else{
                return get_next($uids ,$k+1 ,$amount);
            }
        }
    }
    return 0;
}</code>

Erhalten Sie insgesamt $47500

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn