4月3日华为笔试题目【回忆版】

今晚华为的题目都好长...我也就说一下题目大意,不明白的可以回复问一下。本人用js写的。A了前两题,300分...

第一题100分:开胃小菜,建议用时20min之内

给一个数x,和若干个数组a1、a2、a3...,输出一个result数组。

要求遍历a1、a2、a3...,从当前数组里取前x个数加入result数组,并在该数组中删除这x个数。如果当前数组的长度小于x,则直接把所有剩余元素加入result。不断遍历,直到a1、a2、a3...都为空数组。输出result。

思路:很简单。。。我就不说了,不断splice就行

第二题200分:有点意思,建议用时30min之内

给定若干个字符串。要求:(注意。。这个题需要有4个输出)

  1. 只包含“0-9, a-z, A-Z”的字符串为合法字符串,其他为非法字符串。请输出所有(去重后的合法字符串)和(非法字符串)【这里是两个输出】

  2. 输出所有合法字符串循环左移10位的结果【第三个输出】

  3. 输出步骤2中结果的字符串们,按ASCII码排序的结果【第四个输出】

思路:确定合法字符串用/^[0-9a-zA-Z]$/正则匹配。循环左移比较简单,模运算算一下就ok。ASCII码排序直接Array.sort()

第三题300分:全靠缘分,建议用时∞

有m个咖啡机,n个人。一个清洗机。
有n个人要喝咖啡,喝完之后要清洗杯子。m个咖啡机做咖啡的时间各不相同,分别为V1、V2...Vm。清洗机清洗杯子所用时间为x。此外,如果一个人喝完的杯子y时间内没清洗,里面的残存的咖啡会挥发掉,相当于清洗完毕。
问所有人喝完咖啡+清洗完杯子需要的最短时间(忽略喝咖啡需要的时间)。

【本人这题没做出来,但是我觉得思路是对的】
思路:模拟过程,考察每个时间点,每个人的状态,并对咖啡机、清洁机作出相应操作。以下代码不能得出正确结果11。事后思考应该是错在咖啡机的调度策略,直接取空闲的&&速度最快的肯定是不对的。

//输入值
let [n, m, x, y] = [2, 2, 1, 1];
let vs = [10, 8];
let timer = 0;

//构造需要的模型
let people = []
for (let i = 0; i < n; i++) {
    people.push({
        id: i,
        getCoffeeTime: false,
        usingMechine: null,
        evaTime: false,
        washTime: false,
        done: false
    })
}
people.done = function () {
    for (let i = 0; i < people.length; i++) {
        if (!people[i].done) return false;
    }
    return true;
}
let mechine = [];
for (let i = 0; i < m; i++) {
    mechine.push({
        id: i,
        v: vs[i],
        working: false,
        endTime: 0
    })
}
//找到空闲的、速度最快的咖啡机【这里的调度策略不对!!!】
mechine.getLeastIdle = function () {
    let idx = false
    let lowerTimer = Infinity;
    for (let i = 0; i < mechine.length; i++) {
        if (!mechine[i].working && mechine[i].v < lowerTimer) {
            idx = i;
            lowerTimer = mechine[i].v;
        }
    }
    return mechine[idx];
}

//是否使用刷杯机,如果自然挥发时间不大于刷杯机刷杯时间,则不用
let useWashMechine = x >= y ? false : true;
let washMechine = {
    working: false,
    v: x
}

//开始模拟
for (; !people.done(); timer++) {
    //对于每个人
    people.forEach(p => {
        if (p.done) return
        // 如果这个人还没有咖啡机给他做咖啡,则给他分配一个空闲的咖啡机做咖啡
        if (p.getCoffeeTime === false) {
            let m = mechine.getLeastIdle();
            if (m) {
                m.working = true;
                p.getCoffeeTime = timer + m.v;
                p.usingMechine = m;
            }
        }
        //如果给这个人的咖啡刚好做好了
        if (p.getCoffeeTime === timer) {
            p.evaTime = timer + y;
            p.usingMechine.working = false;
        }
        //判断是否值得用咖啡机
        if (p.getCoffeeTime <= timer && p.getCoffeeTime + washMechine.v < p.evaTime) {
            if (useWashMechine && !washMechine.working) {
                p.washTime = timer + washMechine.v; //记录洗好被子的时间
            }
        }

        if (p.evaTime === timer) {
            p.done = true;
        }

        if (p.washTime === timer) {
            p.done = true;
            washMechine.working = false;
        }
    })
}

print(timer);
#华为##笔试题目##笔经#
全部评论
1、生产咖啡: 使用一个小根堆来维护,时间更新(更新见更新规则),堆顶最先为0,生产一杯,变为0后重新装载原先值,更新小根堆(heapify)保证堆顶最小 2、洗杯子: 数组存需要清洗的杯子,杯子由(x, y_cur)表示,数组根据y_cur降序排序,x清洗y_cur最大杯子(此处假设x<y,若x>=y只需自动挥发即可),时间更新(),更新数组中y_cur,小于0的。。。 3、时间更新规则: a: 堆顶值,x以小的值为时间更新间隔 b: 先更新数组 c: 再更新小根堆,若产出咖啡加入数组,若不产生咖啡更新时间间隔 d: 判断是否生产n杯,是否清洗n杯 e: ...回到a 个人思路,望大家一起讨论
点赞 回复 分享
发布于 2019-04-04 10:39
1.生产咖啡:抽象一个咖啡机类,维护咖啡机数组,用各机器生产时间初始化,每次time++然后更新机器的生产耗时,达到生产时间生产一杯咖啡 2.洗杯子:维护一个杯子队列,生产完一杯咖啡就增加一个杯子,每次time++并维护杯子自带的自动净化时间,到点自动remove掉,然后维护一个洗杯机器到点自动从被子数组里清空最后一个杯子 3.杯子队列为空即完成
点赞 回复 分享
发布于 2019-04-04 08:55
我也想了一下,应该是个模拟题,模拟每个人的完成时间最短就可以了 要看当前这个人在每个机器完成的时间,然后取时间最短,更新机器状态,然后继续
点赞 回复 分享
发布于 2019-04-03 22:05
第三题 (1)首先用优先队列求出生产每一杯咖啡的时间点,时间复杂度nlogm。 比如4台咖啡机生产时间为{2,3,5,7},第一杯咖啡用第一台机器生产,时间为2,然后将2+2,插入优先队列,变成了{3,4,5,7},所以第二杯咖啡在时间点3生产好,将3+3,插入队列{4,5,6,7};第三杯咖啡为4,将4+2插入队列,{5,6,6,7}。第4杯咖啡时间为5,将5+5插入队列,{6,6,7,10}... (2)最后得到一个长度为n的数组,记录每一杯咖啡的生产时间。在这个基础上,最后一杯咖啡的时间为time[n-1],生产时间小于 time[n-1] - y 的所有杯子都能自动挥发掉。最后只需要处理部分咖啡杯,至于怎么处理....
点赞 回复 分享
发布于 2020-06-08 00:45
我的想法是这样的,咖啡机建个最小堆,时间就是咖啡时间和净化时间,已经喝了咖啡的人数少于全部就一直去最小堆里取咖啡机,最后把最小堆里最大的时间取出来就是结果时间了吧
点赞 回复 分享
发布于 2019-04-05 16:02
我的洗杯子的思路是这样的,记录每一杯咖啡生产完的时间点,筛选出(时间点+自净化时间)>生产完毕时间的那些点。然后倒推,最后一个杯子一定要用洗杯机洗,前面的每个杯子能洗就洗,不能就自净化,然后得出最大的时间就是结果时间
点赞 回复 分享
发布于 2019-04-04 23:12
我一直以为是动态规划,一直想,看来思路错了。
点赞 回复 分享
发布于 2019-04-04 07:58
我只思考了怎么最快的生产咖啡,讲下思路: 咖啡机用时排序 假设所有的N杯咖啡都由用时最短的0号咖啡机生产 维护最大时间MAX_TIME 从1号到M-1号咖啡机循环 若取当前咖啡机可以减小MAX_TIME就取1次,然后循环取几次就这样一直维护MAX_TIME。 洗杯子没啥思路
点赞 回复 分享
发布于 2019-04-04 00:42
不能找空闲的咖啡机,可能会存在极端情况,比如说一台咖啡机特别慢1000。我的想法是建一个数组存储每台咖啡机前需要等待的时间,每个人去选择时间最短的,不管前面拍了几个人。
点赞 回复 分享
发布于 2019-04-04 00:17
哇,C++输入处理哭了
点赞 回复 分享
发布于 2019-04-03 22:29
楼主。。。你投的是春招还是实习啊
点赞 回复 分享
发布于 2019-04-03 22:05
楼主,总分多少啊,多少分可以过啊?
点赞 回复 分享
发布于 2019-04-03 22:02

相关推荐

SHC2:关键问题是你这三段实习是三个不同的岗位…你这样子秋招就是只有一段实习的本科生..
点赞 评论 收藏
分享
评论
点赞
74
分享

创作者周榜

更多
牛客网
牛客企业服务