首页 > 后端开发 > php教程 > 帮帮看看这个简单的算法

帮帮看看这个简单的算法

WBOY
发布: 2016-09-19 09:16:25
原创
1036 人浏览过

写的不好,求大家优化
一个用户ID的数组

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

这个数组的每一个键值代表一个UID
金额数组

<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>
登录后复制
登录后复制

此数组的键名和$uid数组的键值对应。
循环$uids这个数组,取出对应的金额$amount,
如果这个金额大于等于12000($boundary),就在总金额($totals)加上这个$amount
如果这个金额小于12000,就再向下循环,循环到这几个$amount相加大于等于12000,然后在总金额($totals)加上这几个$amount的和
最多取三层。
最后得出$totals的值。
我现在的代码:

<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>
登录后复制
登录后复制

得出$totals=47500

回复内容:

写的不好,求大家优化
一个用户ID的数组

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

这个数组的每一个键值代表一个UID
金额数组

<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>
登录后复制
登录后复制

此数组的键名和$uid数组的键值对应。
循环$uids这个数组,取出对应的金额$amount,
如果这个金额大于等于12000($boundary),就在总金额($totals)加上这个$amount
如果这个金额小于12000,就再向下循环,循环到这几个$amount相加大于等于12000,然后在总金额($totals)加上这几个$amount的和
最多取三层。
最后得出$totals的值。
我现在的代码:

<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>
登录后复制
登录后复制

得出$totals=47500

相关标签:
php
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板