#腾讯笔试10.26 ak代码#
五题难度分析,四道medium,一道hard
第一题
ListNode* xorList(ListNode* a, ListNode* b) {
stack<ListNode*>st;
ListNode* ca=a;
ListNode* cb=b;
while(ca!=nullptr){
st.push(ca);
ca=ca->next;
}
ListNode* head=new ListNode(0);
while(!st.empty()){
ListNode* t=new ListNode(st.top()->val^cb->val);
t->next=head->next;
head->next=t;
cb=cb->next;
st.pop();
if(cb==nullptr){
while(!st.empty()){
ListNode* t=st.top();
t->next=head->next;
head->next=t;
st.pop();
}
}
}
if(cb!=nullptr){
while (cb!=nullptr) {
ListNode* t=new ListNode(cb->val);
t->next=head->next;
head->next=t;
cb=cb->next;
}
}
ListNode* h=head->next;
while(h!=nullptr&&h->val==0){
h=h->next;
}
if(h==nullptr) h=new ListNode(0);
return h;
}
第二题
#include<iostream>
#include<vector>
#include<cmath>
#include<map>
#include<unordered_map>
#include<set>
#include<string>
#include<stack>
#include<algorithm>
#include<bitset>
#include<queue>
#include<iomanip>
#include<cstring>
using namespace std;
typedef pair<int,int> pi;
int count(int n){
int res=0;
while(n!=0){
n=n&(n-1);
res++;
}
return res;
}
int main(){
int n,k;
cin>>n>>k;
vector<int>v(n);
priority_queue<pi>q;
long long res=0;
for(int i=0;i<n;i++) {
cin>>v[i];
res+=(long long)v[i];
q.push(pi(v[i]-count(v[i]),i));
}
while(k--){
auto [a,i]=q.top();
q.pop();
int x=v[i]-a;
res=res-a+(long long)x;
q.push(pi(x,i));
}
cout<<res<<endl;
}
第三题
#include<iostream>
#include<vector>
#include<cmath>
#include<map>
#include<unordered_map>
#include<set>
#include<string>
#include<stack>
#include<algorithm>
#include<bitset>
#include<queue>
#include<iomanip>
#include<cstring>
using namespace std;
int main(){
int n;
cin>>n;
deque<int>q;
int a;
for(int i=0;i<n;i++){
cin>>a;
q.push_back(a);
}
vector<int>v(n);
for(int i=1;i<=n;i++){
if(i&1==1){
v[i-1]=max(q.front(),q.back());
if(q.front()>=q.back()){
q.pop_front();
}else q.pop_back();
}else{
v[i-1]=min(q.front(),q.back());
if(q.front()<=q.back()){
q.pop_front();
}else q.pop_back();
}
}
for(auto i:v) cout<<i<<" ";
cout<<endl;
}
第四题
#include<iostream>
#include<vector>
#include<cmath>
#include<map>
#include<unordered_map>
#include<set>
#include<string>
#include<stack>
#include<algorithm>
#include<bitset>
#include<queue>
#include<iomanip>
#include<cstring>
using namespace std;
long long f(long long n,long long y){
if(n==1) return cal(y);
long long x=1;
while(x<n) x=x<<1;
if(x==n) return x/2;
return x/4+f(n-x/2,y);
}
bool cal(long long n){
if(n==1) return 1;
long long x=1;
while(x<n) x=x<<1;
return !cal(n-x/2);
}
int main(){
long long l,r;
cin>>l>>r;
long long x=f(r,r)-f(l-1,l-1);
cout<<x<<endl;
}
第五题
第五题多说一嘴哈,其实这个题可以分解为,将一个数组分为两部分,使得两部分的和的差值最小,保存怎么分的就行
#include<iostream>
#include<vector>
#include<cmath>
#include<map>
#include<unordered_map>
#include<set>
#include<string>
#include<stack>
#include<algorithm>
#include<bitset>
#include<queue>
#include<iomanip>
#include<cstring>
using namespace std;
vector<int>st;
int mx=0;
unordered_map<long,int>p;
int jud(vector<int>&a,int x,int i,vector<int>&v,int cur){
if(i==a.size()){
if(cur>mx){
st=v;
mx=cur;
}
return cur;
}
long ss=cur*101+i;
int res=0;
if(p.count(ss)) return p[ss];
if(a[i]+cur>x){
res=jud(a,x,i+1,v,cur);
}else{
v[i]=1;
int l=jud(a,x,i+1,v,cur+a[i]);
v[i]=0;
int r=jud(a,x,i+1,v,cur);
res=max(l,r);
}
p[ss]=res;
return res;
}
int main(){
int n,sum=0;
cin>>n;
vector<int>a(n);
st.resize(n,0);
for(int i=0;i<n;i++) {
cin>>a[i];
sum+=a[i];
}
int x=0,y=0;
vector<int>v(n,0);
x=jud(a,sum/2,0,v,0);
y=x-sum;
cout<<x<<" "<<y<<endl;
for(int i=0;i<st.size();i++){
if(st[i]==1){
cout<<"Y";
}else cout<<"X";
}
cout<<endl;
}
查看7道真题和解析
SHEIN希音公司福利 278人发布