栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【2021】贝壳找房春招C++工程师笔试卷2

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【2021】贝壳找房春招C++工程师笔试卷2

文章目录
    • 前言
    • 一、[编程题]完美序列
      • 1.1 题目连接
      • 1.2 题面
      • 1.3 思路
      • 1.4 代码
    • 二、[编程题]商场收益统计
      • 2.1 题目链接
      • 2.2 题面
      • 2.3 思路
      • 2.4 代码
    • 三、[编程题]大橘为重
      • 3.1 题目链接
      • 3.2 题面
      • 3.3 思路
      • 3.4 代码
    • 四、[编程题]叠大饼
      • 4.1 题目链接
      • 4.2 题面
      • 4.3 思路
      • 4.4 代码

前言

面试的链接:https://www.nowcoder.com/test/35148556/summary

牛客的校招面试真题,稍微做了一下,写了快一个小时,不知道为啥只有 90 分,勉强写个题解吧

一、[编程题]完美序列 1.1 题目连接

https://www.nowcoder.com/questionTerminal/4017903f92b6455790b4c670c7176156

1.2 题面

1.3 思路

看一下数据范围 n n n 的范围是 1 e 4 1e4 1e4 ,只要 O ( N 2 ) O(N^2) O(N2) 以内的复杂度都能接受,于是我们可以先将数据处理为 − 1 、 1 -1、1 −1、1 的序列(分别对应小于等于 k k k 的数和大于 k k k 的数),然后对这个序列做一个前缀和,很显然,当一个序列的区间和大于 0 0 0 的时候就是一个完美的序列,那么我们只需要枚举一下区间的左端点,以及区间的长度即可,这样的话整体复杂度 O ( N 2 ) O(N^2) O(N2) 满足题目要求

ps:这里我开始以为能用双指针,琢磨了半小时发现写不出来(

1.4 代码
#include
using namespace std;
#define endl "n"
const int N = 1e5+10;

int n,k;
int a[N],b[N];

int main()
{
	cin>>n>>k;
	int l = 0,r = 0;
	for(int i = 1;i <= n; ++i) {
		cin>>a[i];
		a[i] = a[i] > k ? 1 : -1;
		b[i] =b[i-1] +  a[i];
	}
	int ans = 0;
	for(int l = 1;l <= n; ++l) {
		for(int r = l + ans;r <= n; ++r) {
			if(b[r]-b[l-1] >= 1) ans = max(ans,r-l+1);
		}
	}
	cout< 
二、[编程题]商场收益统计 
2.1 题目链接 

https://www.nowcoder.com/questionTerminal/047b18918d914f19bb6b5f90a1949e00

2.2 题面

2.3 思路

这题没啥好说的,弄一个 map> 存一下商品的信息或者你用两个map 也是可以的,然后在下面的订单中我们进行比较即可

2.4 代码
#include
using namespace std;
#define int long long
#define mod 1000000007
#define endl "n"
#define PII pair
#define INF 0x3f3f3f3f

int n,m;
map> st;

signed main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	string s;
	int w,c;
	for(int i = 1;i <= n; ++i) {
		cin>>s>>w>>c;
		st[s]={w,c};
	}
	int err = 0;
	long long sum = 0;
	for(int i = 1;i <= m; ++i) {
		cin>>s>>c;
		if(st[s].second < c) {
			err = -i;
			break;
		}
		st[s].second -= c;
		sum += st[s].first * c;
	}
	if(err != 0) {
		cout<
		cout< 
三、[编程题]大橘为重 
3.1 题目链接 

https://www.nowcoder.com/questionTerminal/8f9de00dfbeb43d7bb58765aad9c5d78

3.2 题面

3.3 思路

这个题面一出来我们就只能 “暴力”了,我们要在每一次询问的时候然后去暴力搜索吗?显然不可行,我们会发现对于这样的一个序列能产生的值就是一颗二叉树,于是我们可以先DFS 预处理一下所有可能存在的值,并存在一个数据结构(map)中,然后每次查询的时候直接找一下存在与否即可。

3.4 代码
#include
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "n"
#define PII pair
#define INF 0x3f3f3f3f

unordered_map st;
int n,q;

void dfs(multiset S){
	ll sum = 0;
	for(auto it : S) sum += it;
	st[sum] = true;
	ll len = S.size();
	if(len == 1) return;
	ll av = sum / len;
	multiset min_s,max_s;
	for(auto it : S){
		if(it > av) max_s.insert(it);
		else min_s.insert(it);
	}
	if(min_s.size() == 0 || max_s.size() == 0) return;
	dfs(max_s);
	dfs(min_s);
	
}

int main()
{
	multiset S;
	scanf("%d%d",&n,&q);
	ll ai;
	for(int i = 1;i <= n; ++i) {
		scanf("%lld",&ai);
		S.insert(ai);
	}
	dfs(S);
	while(q--) {
		scanf("%lld",&ai);
		if(st[ai]) puts("YES");
		else puts("NO");
	}
	
	return 0;
}
四、[编程题]叠大饼 4.1 题目链接

https://www.nowcoder.com/questionTerminal/c2e0e9c1bd3e44b383781b7762944ec3

4.2 题面

4.3 思路

这道题开始看一眼,和天梯赛的这题:L2-014 列车调度 很相似,但是稍有不同,这道题允许重组顺序,并且第 i i i 个大饼要比第 j j j 个大饼大,那么我们不难发现对于这个大饼的堆叠数量其实就是频率出现最高的饼,因为我们贪心的去想的话,那应该是如果能够放在当前这一堆里面,那必然不放在下一堆的里面,我们迟早会遇上同大小的饼子同时出现的清空,那么这个堆叠数量就不可避免

4.4 代码
#include
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "n"
#define PII pair
#define INF 0x3f3f3f3f

const int N = 1e5+10;

int n,a[N];
map st;

int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n;
	
	for(int i = 0;i < n; ++i) {
		cin>>a[i];
		st[a[i]]++;
	}
	int ans = 1;
	for(auto it : st)
		ans = max(ans,it.second);
	
	cout<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/976376.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号