当前位置: 首页 > 面试经验 >

拼多多后端笔试题解 2023.3.12 附源码

优质
小牛编辑
82浏览
2023-03-28

拼多多后端笔试题解 2023.3.12 附源码

T1 100/100

没啥好说的家人们


// 100 points
#include <bits/stdc++.h>
#define int long long
#define sc(a) scanf("%lld",&a)
#define pr(a) printf("%lld",a)
#define re(i,a,b) for(int i=a;i<=b;++i)
using namespace std;

string s,ss;

signed main() {
cin>>s;
int cnt=0;
for(auto i:s) {
if(isalpha(i)) {
re(j,1,cnt) ss+=i;
cnt=0;
} else {
cnt*=10;
cnt+=(i-'0');
}
}
cout<<ss;
return 0;
}

T2 100/100

思路题,答案只跟1有关,消掉所有的1,其他全部一次解决


// 100 points
#include <bits/stdc++.h>
#define int long long
#define sc(a) scanf("%lld",&a)
#define pr(a) printf("%lld",a)
#define re(i,a,b) for(int i=a;i<=b;++i)
using namespace std;

int t,n;
int a[205];

void gao() {
re(i,1,n) sc(a[i]);
sort(a+1,a+1+n);
int cnt=0;
re(i,1,n) if(a[i]==1) ++cnt;
int ans=cnt/2;
if(cnt%2==1) --cnt;
ans+=n-cnt;
pr(ans);
puts("");
}

signed main() {
sc(t),sc(n);
while(t--) gao();
return 0;
}

T3 65/100

带权二分图匹配模板题,KM算法,把abc三类点扩展成300个点跑匹配即可,但是我实在背不住模板,写了个dfs溜了


// 65 points
#include <bits/stdc++.h>
#define int long long
#define sc(a) scanf("%lld",&a)
#define pr(a) printf("%lld",a)
#define re(i,a,b) for(int i=a;i<=b;++i)
using namespace std;

int n;
int mp[105][3];
char s[5];
int cnt[3],val[3];

int ans=0x3f3f3f3f;
int sum=0;
int pos=-1;

void dfs(int i) {
if(sum>ans) return;
pos=max(pos,i);
if(i==n+1) {
ans=min(ans,sum);
return;
}
re(j,0,2)
if(mp[i][j]&&cnt[j]>0) {
--cnt[j];
sum+=val[j];
dfs(i+1);
++cnt[j];
sum-=val[j];
}
}

signed main() {
sc(n);
re(i,1,n) {
scanf("%s",s);
re(j,0,strlen(s)-1) {
if(s[j]=='A') mp[i][0]=1;
else if(s[j]=='B') mp[i][1]=1;
else if(s[j]=='C') mp[i][2]=1;
}
}
re(i,0,2) sc(cnt[i]),sc(val[i]);
dfs(1);
if(ans!=0x3f3f3f3f) {
puts("YES");
pr(ans);
}
else {
puts("NO");
pr(pos-1);
}
return 0;
}

T4 100/100

平均数很简单,中位数的话要找一个动态有序且支持重复的数据结构,自然想到cpp的mutiset,在插入时维护一下中位数指针位置即可,关键代码在37-46行


// 100 points
#include <bits/stdc++.h>
#define int long long
#define sc(a) scanf("%lld",&a)
#define pr(a) printf("%lld",a)
#define re(i,a,b) for(int i=a;i<=b;++i)
using namespace std;

int n;
int a[200005];
int avg[200005];
int mid[200005];
multiset<int> s;

int gao(int a,int b) {
double d=(double)a/b;
int f=floor(d);
if(d-f>0.4999999) return f+1;
return f;
}

signed main() {
sc(n);
re(i,1,n) sc(a[i]);
double sum=0;
re(i,1,n) {
sum+=a[i];
avg[i]=gao(sum,i);
}
mid[1]=a[1],s.insert(a[1]);
if(n>=2) mid[2]=gao(a[1]+a[2],2),s.insert(a[2]);
auto p=s.begin();
++p;
re(i,3,n) {
s.insert(a[i]);
if(a[i]>=*p&&i%2==0) ++p;
if(a[i]<*p&&i%2==1) --p;
if(i%2==1) {
mid[i]=*p;
} else {
auto q=p;
--p;
mid[i]=gao(*p+(*q),2);
// if(i==5) cout<<*p<<' '<<*q<<endl;
++p;
}
}
re(i,1,n) pr(avg[i]),printf(" ");
puts("");
re(i,1,n) pr(mid[i]),printf(" ");
return 0;
}
#笔试##笔试复盘##拼多多笔试#
 类似资料: