某公司奇葩面试题,求解 [ 2.0 版本 ]
某公司奇葩面试题,大神求解
最佳答案
-
参考 @师阳 思路,简单写了一下
function getAvgWaitTime($aTimes,$pTimes,$num=4) { $waitTime = 0; // 总等待时间 $len = count($aTimes); // 总人数 $now = []; // 当前窗口排队人的离开时刻 for ($i=0; $i < $num; $i++) { $now[] = $aTimes[$i]+$pTimes[$i]; } // 第五人开始 for ($i=4; $i < $len; $i++) { $minTime = min($now); $waitTime += $minTime-$aTimes[$i]; //最少的离开窗口,下一个补上 $key = array_search($minTime, $now); $now[$key] = $waitTime+$pTimes[$i]; } return $waitTime/$len; }
共 1 条回复tinymeng 觉得很赞
其他 5 个回答
-
用上面的例子为什么我会算出104.166667
共 1 条回复 -
附加题:
可以参考 数线段问题
即一条直线上有N个点,问有几条线段,先判断那些是线段,再判断线段长度。从下向上
- 遍历数组,起始不数, 大于0开始数,数组项等于0结果加1 (最下边一层)
- 遍历结束,数组每个值都减去1 (上移一层)
- 重复1,2,直到数组总和小于等于1,返回结果
function foo($arr){ $result = 0; while (array_sum($arr)>1) { $countFlag = 0; $temp = 0; foreach ($arr as $key => $value) { if($value==0){ $temp+=1; } if($value>=1){ $countFlag+=1; $arr[$key]-=1; if($countFlag==2){ $result+=$temp; $countFlag=1; $temp=0; }else{ $temp=0; } } } } return $result; }
写的过程中,发现思路有点问题,引入临时变量$temp,$countFlag也多加了一个状态,然后解决了问题。
应该有更简单的办法,这个算法,复杂度比较高。
重新整理了一下思路:- 先去掉首尾的0
- 按1分割数组,计算各个数组0元素的个数
- 数组大于等于1的值都减去1,重复1,2
tinymeng 北京
注册时间:2018-03-05
最后登录:2024-10-24
在线时长:36小时43分
最后登录:2024-10-24
在线时长:36小时43分
- 粉丝7
- 金钱25065
- 威望20
- 积分25625