2021贝壳找房春招C++工程师笔试卷2
Posted MangataTS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021贝壳找房春招C++工程师笔试卷2相关的知识,希望对你有一定的参考价值。
文章目录
前言
面试的链接: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<bits/stdc++.h>
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<<ans<<endl;
return 0;
二、[编程题]商场收益统计
2.1 题目链接
https://www.nowcoder.com/questionTerminal/047b18918d914f19bb6b5f90a1949e00
2.2 题面
2.3 思路
这题没啥好说的,弄一个 map<string,pair<int,int>>
存一下商品的信息或者你用两个map
也是可以的,然后在下面的订单中我们进行比较即可
2.4 代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define mod 1000000007
#define endl "\\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f
int n,m;
map<string,pair<int,int>> 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<<err<<endl;
else
cout<<sum<<endl;
return 0;
三、[编程题]大橘为重
3.1 题目链接
https://www.nowcoder.com/questionTerminal/8f9de00dfbeb43d7bb58765aad9c5d78
3.2 题面
3.3 思路
这个题面一出来我们就只能 “暴力”了,我们要在每一次询问的时候然后去暴力搜索吗?显然不可行,我们会发现对于这样的一个序列能产生的值就是一颗二叉树,于是我们可以先DFS
预处理一下所有可能存在的值,并存在一个数据结构(map
)中,然后每次查询的时候直接找一下存在与否即可。
3.4 代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "\\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f
unordered_map<ll,bool> st;
int n,q;
void dfs(multiset<ll> 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<ll> 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<ll> 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<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "\\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f
const int N = 1e5+10;
int n,a[N];
map<int,int> 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<<ans<<endl;
return 0;
以上是关于2021贝壳找房春招C++工程师笔试卷2的主要内容,如果未能解决你的问题,请参考以下文章