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个输出)
只包含“0-9, a-z, A-Z”的字符串为合法字符串,其他为非法字符串。请输出所有(去重后的合法字符串)和(非法字符串)【这里是两个输出】
输出所有合法字符串循环左移10位的结果【第三个输出】
输出步骤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);
#华为##笔试题目##笔经#