字节跳动2020秋招8月11笔试记录

1. 第一题关于闹钟的(80%)

// 1. 可能有多个闹钟可以及时到达教室
// 2. 要在所有闹钟中找一个最优解

// 时间描述成绝对时间: A * 60 + B 分钟
function getTime(arr) {
    return arr[0] * 60 + arr[1];
}

// 输入部分
var N = parseInt(readline()); // 闹钟数目
var rawClocks = []; // 原始时间数据
var clocks = []; // 所有闹钟时间
for (let i = 0; i < N; i++) {
    rawClocks.push(readline().split(" ").map(function (d) {
        return parseInt(d);
    }));
}
clocks = rawClocks.map(getTime);
var cost = parseInt(readline()); // 需要时间
// 死亡线
var deadLine = getTime(readline().split(" ").map(function (d) {
    return parseInt(d);
}));

// 逻辑部分
// 先遍历,找到所有可以满足条件的闹钟
var bestDiff; // 最优解差值
var curDiff; // 当前差值
var index; // 最优解索引
for(let i = 0; i < N; i++){
    curDiff = deadLine - clocks[i];
    if(curDiff >=cost){
        // OK, 在其中找到最优解,使用差值记录最优解,一旦差值更小就更新
        if(bestDiff !== undefined){
            if(curDiff < bestDiff){
                // 更新
                index = i;
                bestDiff = curDiff;
            }
            // 抛弃已知的非最优解
        }else{
            // 初始化
            index = i;
            bestDiff = curDiff;
        }
    }
}


// 输出部分
var answer = rawClocks[index][0] + " " + rawClocks[index][1];
print(answer);

2. 第二题是字符串加解密(0%)

3. 第三题是按年龄发工资的题(0%)

// 贪心算法的意思
// 每次找最小年龄的员工为其发钱,并观察左右的钱数,不得少于左右
// 所以首先要有查找最小值的算法
// 然后记录最小值索引

var N = readline(); // 员工数
var rawYear = readline().split(" ").map(function (d) {
    return parseInt(d);
}); // 座位年限
var salary = rawYear.map(function () {
    return 0
}); // 工资
var hasSalary = [];
var min = 0; // 年龄最小索引

for (let i = 0; i < N; i++) {
    // 初始化min, 没发工资的人里的第一个
    min = 0;
    while (hasSalary.includes(min)) {
        min++;
    }
    // 找年龄最小值
    for (let j = min; j < N; j++) {
        if (!hasSalary.includes(j) && rawYear[j] < rawYear[min]) {
            min = j;
        }
    }
    hasSalary.push(min);
    // 开始发工资
    // 如果等于上一个最小值的年龄,就直接和上一个发一样的工资
    if (hasSalary.length > 1 && rawYear[min] === rawYear[hasSalary.slice(-2)[0]]) {
        salary[min] = salary[hasSalary.slice(-2)[0]];
    } else if (min === 0) {
        // 找工资极小值+100,就是本人工资
        salary[0] = salary[1] + 100;
    } else if (min === N - 1) {
        salary[N - 1] = salary[N - 2] + 100;
    } else {
        // 左右都有人,找较大者+100
        if (salary[min - 1] > salary[min + 1]) {
            salary[min] = salary[min - 1] + 100;
        } else {
            salary[min] = salary[min + 1] + 100;
        }
    }
}
console.log(hasSalary);
console.log(salary);

4. 第四题大概是个路径遍历方面的问题吧,不懂(0%)

5. 总结

笔试答得非常难受,与字节也就走到这里了。希望剩下的一个月能找到一个钱多的工作吧。