别人面经笔试题笔记

【华为】875. 爱吃香蕉的珂珂

珂珂要吃香蕉,因此至少要吃一根香蕉,k 的最小取值为 1。由于珂珂每个小时只能吃一堆香蕉,因此珂珂吃的速度过大也没用,k 的最大取值为这 n 堆香蕉的最大根数。
题意转变成,从[1, maxN] 里找到最小能满足吃完香蕉的数。使用 check() 函数表示能否满足要求。
代码要点:由于第 i 堆香蕉数未必能整除 k,因此,若有余数,仍需要多花 1 个小时吃。

class Solution {
public:
    int minEatingSpeed(vector<int>& piles, int h) {
        int lft = 1, rgt = 0, mid;
        int res = INT_MAX;
        for (auto &data : piles)
            rgt = max(rgt, data);
        while (lft <= rgt) {
            mid = rgt - (rgt-lft)/2;
            // 若当前元素满足要求
            if (check(piles, h, mid)) {
                res = min(res, mid);
                rgt = mid - 1;
            }
            else
                lft = mid + 1;
        }
        return res;
    }
    bool check(vector<int>& piles, int h, int k) {
        int time = 0;
        for (auto &data : piles) {
            time += data/k;
            if (data % k)
                ++time;
        }
        return time <= h;
    }
};

【字节】合并 k 个有序数组

https://www.cnblogs.com/tsdblogs/p/9848674.html

利用此题再回顾下堆排序

【奇信安】有向无环图 0 号起点到 4号终点的路径个数 【重做】

// 输入用例
[[1,2,3],[3],[3],[]]

算法思想:dp[0][j] 表示从起点 0 出发,经过结点 i 到达节点 j 的路径总数。
转移方程:dp[0][j] += dp[0][k] (if (nums[k][j]))
初始时:对 dp[0][i] 进行赋值。
发现,其实可以用 1 维来解决

#include <iostream>
#include <vector>
using namespace std;


class Solution {
public:
    int getAns(vector<vector<int>> &vec){
        int n = vec.size();
        vector<vector<int>> dp(n, vector<int>(n, 0));
        for (auto j : vec[0])
            dp[0][j] = 1;
        for (int k=1; k<n; ++k) {
            vector<int> tmp = vec[k];
            for (auto j : tmp)
                dp[0][j] += dp[0][k];
        }
        return dp[0][n-1];
    }
};

int main() {
    vector<int> v0 ={1,2,3};
    vector<int> v1 ={3};
    vector<int> v2 ={3};
    vector<int> v3 ={4};
    vector<vector<int>> vec = {v0, v1, v2, v3};
    Solution* sol = new Solution();
    cout << sol->getAns(vec) << endl;

    return 0;
}

第 2 题 Leetcode 84 柱状图中最大的矩形

https://leetcode.cn/classic/problems/largest-rectangle-in-histogram/description/


光线云

第二题 Leetcode 8. 字符串转换整数 (atoi)

第三题 Leetcode 有原题

第四题 学习汤哥对图(树)的存储方式


#include <iostream>
#include <vector>
#include <string>
using namespace std;

int dfs(int cur, vector<vector<int>> &tree, vector<int> &counter, const string& color) {
    int cnt = color[cur - 1] == 'R' ? 1 : 0;
    for (auto & next: tree[cur]) {
        cnt += dfs(next, tree, counter, color);
    }
    counter[cur] = cnt;
    return cnt;
}

int main() {
    int n;
    cin >> n;
    vector<vector<int>> tree;
    tree.resize(n + 1);
    for (int i = 2; i <= n; i++) {
        int p;
        cin >> p;
        tree[p].emplace_back(i);
    }
    getchar();
    string color;
    cin >> color;

    vector<int> counter;
    counter.resize(n + 1);
    dfs(1, tree, counter, color);

    int q;
    cin >> q;
    for (int i = 0; i < q; i++) {
        int node;
        cin >> node;
        cout << counter[node] << endl;
    }
    return 0;
}

/*
 5
 1 2 1 4
 WRWRR
 3
 3
 4
 5

 */

第5 题交易 k 次股票

posted @ 2022-08-11 19:17  MasterBean  阅读(29)  评论(0)    收藏  举报