2019-09-27 10:56:21 2268次浏览 6条回答 1 悬赏 100 金钱

某公司奇葩面试题,大神求解
QQ图片20190927110402.png

最佳答案

  • 哈哈看呵呵 发布于 2019-09-29 23:42 举报

    参考 思路,简单写了一下

    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 条回复
    回复于 2019-10-08 11:09 回复

    你说的多 我试试 但是我也不知道正确答案 给你采纳

    觉得很赞
  • 回答于 2019-10-03 22:13 举报

    面试的公司是在地铁八号线的龙旗广场那里?

    1 条回复
    回复于 2020-10-13 20:02 回复

    不记得了 哈哈

  • 回答于 2019-09-29 23:59 举报

    附加题:
    可以参考 数线段问题
    即一条直线上有N个点,问有几条线段,先判断那些是线段,再判断线段长度。

    从下向上

    1. 遍历数组,起始不数, 大于0开始数,数组项等于0结果加1 (最下边一层)
    2. 遍历结束,数组每个值都减去1 (上移一层)
    3. 重复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也多加了一个状态,然后解决了问题。
    应该有更简单的办法,这个算法,复杂度比较高。
    重新整理了一下思路:

    1. 先去掉首尾的0
    2. 按1分割数组,计算各个数组0元素的个数
    3. 数组大于等于1的值都减去1,重复1,2
  • 回答于 2019-09-29 08:53 举报

    I won't be able to do it now.Go on.

    1 条回复
    回复于 2019-10-08 11:07 回复

    臣妾做不到 好好学

    , 觉得很赞
  • 回答于 2019-09-28 09:25 举报

    用上面的例子为什么我会算出104.166667

    1 条回复
    回复于 2019-09-28 22:37 回复

    上面的例子没毛病。注意是等待时长,且有4个窗口。先到达的4个人不用排队,等待时间是0。第5个人需要等10秒(即第三个人的3(到达时间) + 11 (取饭时间)- 4(第5个人到达时间)= 10)。第6个人需要等待14秒(即第二个人的2(到达时间)+ 20 (取饭时间) - 8(第6个人到达时间)=14)。

    所以答案:平均等待时长(10+14)/ 6 = 4。
    理解题目后,使用最小堆(或者说优先队列),队列元素保持4个,内容为(到达时间+取饭时间),然后模拟一下就好了。

  • 回答于 2019-09-27 11:01 举报

    我的脖子...

    1 条回复
    回复于 2019-09-27 11:05 回复

    正过来了 😄

    觉得很赞
您需要登录后才可以回答。登录 | 立即注册
tinymeng
副董事长

tinymeng 北京

注册时间:2018-03-05
最后登录:2024-02-02
在线时长:36小时39分
  • 粉丝7
  • 金钱25060
  • 威望20
  • 积分25620

热门问题