0
点赞
收藏
分享

微信扫一扫

【网易实习】往年笔试题目练习

北邮郭大宝 2022-04-16 阅读 28
c++

网易笔试题目练习

牛牛找工作(贪心)

原题目以及java解法
核心思想:用哈希表和排序降低时间复杂度

技巧在于:

  • 用哈希:使得输入某个伙伴能力值后可以立刻输出最优解
  • 用排序:实现贪心算法,避免二重循环,排序后O(n)一遍更新就可以得到所有最优解

数据结构:
D[i]数组(值 ≥ \geq 0),i=0,1,…,m+n-1, 先存入工作难度再存人能力值

hs_Pay hashmap(D[i]->P[i])

对D[i]排序(sort), D[i]->P[i]的最大值就是max(P[0],P[1],…,P[i])
如此将hs_Pay更新成目标所求(maxPay)

再用hs_Pay输出每个人的最大收入的工作(maxPay)即可

示例输入:
3 3
1 100
10 1000
1000000000 1001
9 10 1000000000
示例输出:
100
1000
1001
//官方题解的理解基础之上的C++版本
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
typedef long long ll;

int main()
{
	int N, M; cin >> N >> M;
	vector<int>	D(N + M);
	unordered_map<int, int>hsPay;
	int i;
	for (i = 0; i < N; i++)//输入(工作难度,收入)
	{
		cin >> D[i];
		cin>>hsPay[D[i]];
	}
	vector<int>Capab;		//!易错点 别写成Capab(M)  否则后面别push_back,要改成直接赋值
	for (i = N; i < N + M; i++)//输入伙伴工作能力
	{
		cin >> D[i];
		Capab.push_back(D[i]);
		if (hsPay.find(D[i]) == hsPay.end())
			hsPay[D[i]] = 0;	//没有记录的能力值暂定收入为0,方便后续排序(贪心)
	}
	sort(D.begin(), D.end()); //算法库中的排序

	//更新hsPay为最优解
	int max = 0;
	for (i = 0; i < D.size(); i++)
	{
		if (max < hsPay[D[i]])max = hsPay[D[i]];
		hsPay[D[i]] = max;
	}
	for (i = 0; i < M; i++)
		cout << hsPay[Capab[i]]<<endl;
}

易错点:
vector的使用(Define and Use):

  • 要么别开空间,直接push_back,就像python-list,
  • 要么开好空间,直接赋值,就像普通数组

1、 第一种情况

//定义
vector<int>List;
...
//使用中
List.push_back(xx);

2、第二种情况

//定义
vector<int>nums(n);
...
//使用中
nums[i]=xx;

不可混淆,避免在一串0之后push_back或者指针越界报错。

举报

相关推荐

0 条评论