字節跳動秋招2020.8.11筆試記錄

字節跳動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. 總結

筆試答得非常難受,與字節也就走到這裏了。希望剩下的一個月能找到一個錢多的工作吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章