别人面经笔试题笔记
【华为】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 个有序数组
利用此题再回顾下堆排序
【奇信安】有向无环图 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 次股票

浙公网安备 33010602011771号