字节9.12笔试
总体来说前面两题满分,后面两个题过了部分,
# 第一题
这个就是原题,华为之前的环形打车问题也是这个
1. 这个题把它想成公交车上最多的乘客数量问题,公交车上乘客上上下下,某时刻车上有多人?最多人是多少?
2. 记录上车+1, 下车减1, 按时间轴排序
3. 其实也就模拟的公交车上下车
4. 答案就是公交车乘客最大值
5. 案例中有大数,需要long long
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char *argv[]) {
int cases;
cin >> cases;
while (cases-- > 0) {
int n;
cin >> n;
vector<vector<long long>> nums(n, vector<long long>(2, 0));
int x, y;
for (int i = 0; i < n; ++i) {
cin >> x >> y;
nums[i][0] = x;
nums[i][1] = x+y;
}
vector<pair<long long, int>> res;
for (int i = 0; i < n; ++i) {
res.push_back({nums[i][0], 1}); /**<上车 */
res.push_back({nums[i][1], -1}); /**<下车 */
}
sort(res.begin(), res.end()); /**<按照时间点排序 */
int ans = 0;
int output = 0;
for (const auto& e : res) {
ans += e.second;
output = max(output, ans); /**<公交车上最多的乘客 */
}
cout << output << '\n';
}
return 0;
}
#if 0
1
2
1 2
2 3
output
2
#endif # 第二题
1. 先建立一棵二叉树createTree
2. 由于每个结点都是唯一的,因此可以记住maxValue
3. 通过辅助函数helper来判断结构是否对称--先序遍历,原题链接
4. 遍历过程中取到对称位置的结点
5. 获取先序遍历的结果,为真则输出对称位置,否则输出原始节点
#include <bits/stdc++.h>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int val) : val(val), left(nullptr), right(nullptr) {}
};
/** \brief createTree 先序、中序建树
* \author wzk
* \copyright GNU Public License
* \version 1.0
* \date 2020-9-12
*
* \param[in] pre 输入pre数组
* \param[in] preStart 输入pre左闭
* \param[in] preEnd 输入pre右闭
* \param[in] in 输入in数组
* \param[in] inStart 输入in左闭
* \param[in] inEnd 输入in右闭
* \param[in] memo 输入中序遍历的hash表
* \return 返回二叉树
*/
TreeNode *createTree(vector<int>& pre, int preStart, int preEnd, vector<int>& in, int inStart, int inEnd, unordered_map<int,int>& memo) {
if (preStart>preEnd || inStart>inEnd)
return nullptr;
TreeNode *root = new TreeNode(pre[preStart]);
int pos = memo[pre[preStart]]; /**<根结点在中序遍历数组的位置 */
int numsLeft = pos - inStart; /**<左子树元素个数 */
root->left = createTree(pre, preStart+1, preStart+numsLeft, in, inStart, pos-1, memo);
root->right = createTree(pre, preStart + numsLeft + 1, preEnd, in, pos + 1, inEnd, memo);
return root;
}
int maxValue = 0; /**<最大节点值 */
int point = 0; /**<对称节点值 */
bool helper(TreeNode *root1, TreeNode *root2) {
if (!root1 && !root2)
return true;
if (!root1 || !root2)
return false;
/**<取对称结点 */
if (root1->val == maxValue) {
point = root2->val;
} else if (root2->val == maxValue) {
point = root1->val;
}
return helper(root1->left, root2->right) && helper(root1->right, root2->left);
}
// 内存释放,考试的时候不用考虑,先做对
void freeTree(TreeNode* root) {
if(root == nullptr)
return;
freeTree(root->left);
freeTree(root->right);
delete root;
}
int main(int argc, char *argv[]) {
int n;
cin >> n;
vector<int> pre(n, 0);
for (int i = 0; i < n; i++) {
cin >> pre[i];
maxValue = max(maxValue, pre[i]); /**<求解最大值,因为没有相同的值 */
}
vector<int> in(n, 0);
for (int i = 0; i < n; i++) {
cin >> in[i];
}
unordered_map<int, int> memo;
for (int i = 0; i < n; i++) {
memo[in[i]] = i;
}
TreeNode *root = createTree(pre, 0, n-1, in, 0, n-1, memo);
bool output = helper(root->left, root->right);
if (output) /**<在对称的前提下,输出对称点 */
cout << point << '\n';
else
cout << maxValue << '\n';
freeTree(root);
return 0;
}
#if 0
3
1 3 4
3 1 4
output: 3
5
1 3 5 7 4
5 3 1 4 7
output: 7
#endif # 第三题
是个大数问题,希望通过的大佬补充
# 第四题
我的没全过,希望通过的大佬补充
#字节笔试##字节跳动##笔经#
查看20道真题和解析