#腾讯笔试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;
}

全部评论
大神就是牛
点赞 回复 分享
发布于 2022-10-18 14:05 河南

相关推荐

评论
2
2
分享

创作者周榜

更多
牛客网
牛客企业服务