腾讯笔试部分题解(之后有空可能补题解)


第一题 字符串解压缩 AC
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
string solve(string str,int start,int end){
    string ans;
    for(int i = start;i<=end;){
        int cnt = 0;
        int val = 0;
        string s1;
        if(str[i]!='['){
            ans+=str[i];
            i++;
        }else{
            cnt++;
            i++;
            while(str[i]>='0'&&str[i]<='9'){
                val = val*10+(str[i]-'0');
                i++;
            }
            i++;
            int s = i;
            while(cnt>0){
                if(str[i]=='['){
                    cnt++;
                }else if(str[i]==']'){
                    cnt--;
                    if(cnt == 0){
                        break;
                    }
                }
                i++;
            }
            int e = i-1;
            s1 = solve(str, s, e);
            i++;
        }
        for(int j = 0;j<val;j++){
            ans+=s1;
        }
    }
    return ans;
}
int main(){
    string s;
    cin>>s;
    int n = s.size();
    cout<<solve(s,0,n)<<endl;
}

第二题 逆序对(好难,树状数组和归并排序可以过50%) 

第三题 最少真眼看到L距离 AC
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int solve(vector<pair<int, int>>& vp,int n,int l){
    sort(vp.begin(), vp.end());
    if(vp[0].first!=0) return -1;
    int cnt = 0;
    int pre_end = 0;
    int end = 0;
    for(int i = 0;i<n;){
        while(i<n && vp[i].first <= pre_end){
            end = max(end,vp[i].second);
            i++;
        }
        cnt++;
        pre_end = end;
        if(pre_end>=l){
            return cnt;
        }
    }
    return -1;
}
int main(){
    int n,l;
    scanf("%d %d",&n,&l);
    vector<pair<int, int>> vp(n);
    for(int i = 0;i<n;i++){
        scanf("%d %d",&vp[i].first,&vp[i].second);
    }
    cout<<solve(vp, n, l)<<endl;
}

第四题 看到的建筑数量 AC
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(){
    int n;
    scanf("%d",&n);
    vector<int> v(n,0);
    for(int i = 0;i<n;i++){
        scanf("%d",&v[i]);
    }
    stack<int> st1;
    stack<int> st2;
    vector<int> left(n,0);
    vector<int> right(n,0);
    vector<int> z(n,0);
    for(int i = 0;i<n;i++){
        if(st1.empty()||st1.top()>v[i]){
            left[i] = st1.size();
            st1.push(v[i]);
        }else{
            left[i] = st1.size();
            while(!st1.empty() && v[i]>=st1.top()){
                st1.pop();
            }
            st1.push(v[i]);
        }
    }
    for(int i = n-1;i>=0;i--){
        if(st2.empty() || st2.top()>v[i]){
            right[i] = st2.size();
            st2.push(v[i]);
        }else{
            right[i] = st2.size();
            while(!st2.empty() && st2.top()<=v[i]){
                st2.pop();
            }
            st2.push(v[i]);
        }
    }
    for(int i = 0;i<n;i++){
        cout<<left[i]+right[i]+1<<" ";
    }
}

第五题 最少休息时间 AC
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(){
    int n;
    scanf("%d",&n);
    vector<int> v1(n);
    vector<int> v2(n);
    for(int i = 0;i<n;i++) scanf("%d",&v1[i]);
    for(int i = 0;i<n;i++) scanf("%d",&v2[i]);
    int dp[n+1][2];
    memset(dp, 0, sizeof dp);
    for(int i = 0;i<n;i++){
        if(v1[i]==1){
            dp[i+1][0] = (i<1?0:dp[i-1][0])+1;
            if(i-1>0 && v1[i-1]==0) dp[i+1][0] = max(dp[i+1][0],dp[i][0]+1);
            dp[i+1][0] = max(dp[i+1][0],dp[i][1]+1);
        }else if(v1[i]==0){
            dp[i+1][0] = max(dp[i+1][0],dp[i][0]);
            dp[i+1][0] = max(dp[i+1][0],dp[i][1]);
        }
        if(v2[i]==1){
            dp[i+1][1] = (i<1?0:dp[i-1][1])+1;
            if(i-1>0 && v2[i-1]==0) dp[i+1][1] = max(dp[i+1][1],dp[i][1]+1);
            dp[i+1][1] = max(dp[i+1][1],dp[i][0]+1);
        }else if(v2[i]==0){
            dp[i+1][1] = max(dp[i+1][1],dp[i][1]);
            dp[i+1][1] = max(dp[i+1][1],dp[i][1]);
        }
    }
    cout<<n-max(dp[n][0],dp[n][1])<<endl;
}
#腾讯##题解##笔试题目#
全部评论
膜拜一下
点赞 回复
分享
发布于 2019-08-17 22:34
有第二题AC的吗,感觉java笔试题是不是难度太大了
点赞 回复
分享
发布于 2019-08-17 22:36
联想
校招火热招聘中
官网直投
谢谢分享,代码思路都好清晰!
点赞 回复
分享
发布于 2019-08-17 23:47
大佬,最后一道题这么做可以吗?很多样例做了测试,和你的答案一样。 #include<iostream> #include<algorithm> using namespace std; int main() { vector<int>g{1,1,1,0}; vector<int>j{1,1,0,0}; int sg = 1,sj = 1,sx = 0; int n = g.size(); for(int i=1; i<g.size(); i++) { int tmpg = sg; int tmpj = sj; int tmpx = sx; if(g[i] && j[i]) { sg = max(tmpx,tmpj) + 1; sj = max(tmpx,tmpg) + 1; }else if(!g[i] && !j[i]){ if(tmpg == tmpj) { sx = (tmpg + tmpj) / 2; }else{ sx = max(tmpg,tmpj); } }else if(g[i]){ sg = max(tmpx,tmpj) + 1; }else{ sj = max(tmpx,tmpg) + 1; } }  cout<<n - max(max(sg,sx),sj);     return 0; }
点赞 回复
分享
发布于 2019-08-18 12:26
请问这是什么岗位的题目呀
点赞 回复
分享
发布于 2019-08-29 17:06
大佬牛批!!!
点赞 回复
分享
发布于 2019-09-17 18:11

相关推荐

2 38 评论
分享
牛客网
牛客企业服务