字节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

# 第三题
是个大数问题,希望通过的大佬补充

# 第四题
我的没全过,希望通过的大佬补充
#字节笔试##字节跳动##笔经#
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-14 23:35
TP-Link联洲国际 图像算法 27k×16 硕士985
点赞 评论 收藏
分享
11-22 20:11
已编辑
门头沟学院 前端工程师
联洲 tp n×16
点赞 评论 收藏
分享
评论
2
3
分享
牛客网
牛客企业服务