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

携程后端笔试题解 2023.3.7 附源码

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

携程后端笔试题解 2023.3.7 附源码

T1 100/100

遇到不连续的更新一下计数器,否则计数器自增就可以


#include <bits/stdc++.h>
#define int long long
#define re(i,a,b) for(int i=a;i<=b;++i)
#define fo(i,a,b) for(int i=a;i<b;++i)
using namespace std;

int n,a[100005];

signed main() {
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;re(i,1,n) cin>>a[i];
int ans=1,tmp=1;
re(i,2,n) {
if(abs(a[i]-a[i-1])>1) {
ans=max(ans,tmp);
tmp=1;
} else {
++tmp;
}
}
cout<<max(ans,tmp);
return 0;
}

T2 100/100

用链表维护字符的插入,插入次数很少,复杂度不高


#include <bits/stdc++.h>
#define int long long
#define re(i,a,b) for(int i=a;i<=b;++i)
#define fo(i,a,b) for(int i=a;i<b;++i)
using namespace std;

int n,q,l,r;
string s;

struct node{
char c;
node* nxt;
node(char C):c(C),nxt(nullptr){}
};

signed main() {
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>q;
cin>>s;
auto head=new node(s[0]);
auto p=head;
fo(i,1,s.length()) {
auto tmp=new node(s[i]);
p->nxt=tmp;
p=p->nxt;
}
while(q--) {
cin>>l>>r;
int cnt=1;
auto p=head;
while(p!=nullptr) {
if(cnt>=l&&cnt<=r) {
auto tmp=new node(p->c);
tmp->nxt=p->nxt;
p->nxt=tmp;
p=p->nxt;
}
p=p->nxt;
++cnt;
}
}
while(head!=nullptr) {
cout<<head->c;
head=head->nxt;
}
return 0;
}

T1 75/100

二分最短时间,判断一元二次方程有没有解即可,但是我可能精度上出了点问题,后来懒得调了


#include <bits/stdc++.h>
#define int long long
#define re(i,a,b) for(int i=a;i<=b;++i)
#define fo(i,a,b) for(int i=a;i<b;++i)
using namespace std;

double v,x,y;

bool ok(double m) {
return (v-m*x)*(v-m*x)>4*x*(y-v*m)
||fabs((v-m*x)*(v-m*x)-4*x*(y-v*m))<1e-8;
}

signed main() {
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>v>>x>>y;
if(fabs(x)<1e-8) {
cout<<y/v;
return 0;
}
double l=0,r=1e18;
while(1) {
if(fabs(l-r)<1e-8) break;
double m=(l+r)/2;
if(ok(m)) r=m;
else l=m;
}
cout<<fixed<<setprecision(5)<<min(r,y/v);
return 0;
}

T4 100/100

dp,每个物品有两种状态,原价买或者半价买,注意半价买的话状态必须从i-2那边转移过来


#include <bits/stdc++.h>
#define int long long
#define re(i,a,b) for(int i=a;i<=b;++i)
#define fo(i,a,b) for(int i=a;i<b;++i)
using namespace std;

int n,x;
int a[1005],b[1005],dp[1005][1005];

signed main() {
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>x;
re(i,1,n) cin>>a[i];re(i,1,n) cin>>b[i];
int ans=0;
re(i,1,n) {
re(j,0,x) {
dp[i][j]=max(dp[i][j],dp[i-1][j]);
if(j>=a[i])
dp[i][j]=max(dp[i][j],dp[i-1][j-a[i]]+b[i]);
if(i>=2&&j>=a[i-1]+a[i]/2)
dp[i][j]=max(dp[i][j],dp[i-2][j-a[i-1]-a[i]/2]+b[i-1]+b[i]);
ans=max(ans,dp[i][j]);
}
}
cout<<ans;
return 0;
}

#笔试##笔试复盘##携程笔试#
 类似资料: