帮帮看看这个简单的算法
程序员文章站
2022-04-14 13:20:40
...
写的不好,求大家优化
一个用户ID的数组
一个用户ID的数组
$uids = [1,2,3,5,6,8,9,11,13,25,65];
这个数组的每一个键值代表一个UID
金额数组
$amounts = [
1=>12000,
2=>500,
3=>11000,
5=>1000,
6=>11000,
8=>12000,
9=>12000,
11=>11000,
13=>12000,
25=>22000,
65=>123123
];
此数组的键名和$uid数组的键值对应。
循环$uids这个数组,取出对应的金额$amount,
如果这个金额大于等于12000($boundary),就在总金额($totals)加上这个$amount
如果这个金额小于12000,就再向下循环,循环到这几个$amount相加大于等于12000,然后在总金额($totals)加上这几个$amount的和
最多取三层。
最后得出$totals的值。
我现在的代码:
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;
}
得出$totals=47500
回复内容:
写的不好,求大家优化
一个用户ID的数组
$uids = [1,2,3,5,6,8,9,11,13,25,65];
这个数组的每一个键值代表一个UID
金额数组
$amounts = [
1=>12000,
2=>500,
3=>11000,
5=>1000,
6=>11000,
8=>12000,
9=>12000,
11=>11000,
13=>12000,
25=>22000,
65=>123123
];
此数组的键名和$uid数组的键值对应。
循环$uids这个数组,取出对应的金额$amount,
如果这个金额大于等于12000($boundary),就在总金额($totals)加上这个$amount
如果这个金额小于12000,就再向下循环,循环到这几个$amount相加大于等于12000,然后在总金额($totals)加上这几个$amount的和
最多取三层。
最后得出$totals的值。
我现在的代码:
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;
}
得出$totals=47500
推荐阅读
-
请问一个树节点的删除算法,请大家过来看看吧
-
网页上的.swf如何下载?帮我看看这个怎么下载_html/css_WEB-ITnose
-
python简单算法的实例分析
-
请问这个utf-8简单的页面,如何从数据库里取的数据中文都是问号,试的办法都不行
-
请问这个utf-8简单的页面,如何从数据库里取的数据中文都是问号,试的办法都不行
-
想对杰奇小说系统做二次开发,哪位高手知道这个系统数据库里日期函数的算法
-
PHP实现的简单组词算法示例
-
引用传递 - php的引用不是指针到底是什么,看看这个输出结果
-
网页上的.swf如何下载?帮我看看这个怎么下载_html/css_WEB-ITnose
-
这个问题不该在这里问哦!看看吧,一段SENDMAIL的配置。不过想要_PHP