字节8.28后端笔试

//第一题,因为都是2的n次方,所以取对数转乘法为加法
int main(){
    int n;
    cin >> n;
    unordered_map<int, int> cache;
    for(int i = 0; i <= 10; ++i){
        cache[1 << i] = i;
    }
    cache[0] = -1;
    for(int i = 0; i < n; ++i){
        int m;
        cin >> m;
        vector<int> nums(m);
        for(int j = 0; j < m; ++j){
            cin >> nums[j];
            nums[j] = cache[nums[j]];
        }
        int max_val = INT_MIN;
        int prefix = 0;
        int prev = -1;
        int left = 0, right = 0;
        for(int k = 0; k < m; ++k){
            if(prev == -1){
                prev = k;
            }
            if(nums[k] == -1){
                prefix = 0;
                prev = -1;
            }else{
                prefix += nums[k];
            }
            if(prefix > max_val){
                max_val = prefix;
                left = prev;
                right = k;
            }
        }
        //此处max避免极端输出是[1,1]的情况
        cout << max(0,left) + 1 << " " << right + 1 << endl;
    }
    return 0;
}
//第二题拓扑排序
int main(){
    int line;
    cin >> line;
    cin.ignore();
    string str;
    getline(cin, str);
    stringstream ss(str);
    vector<int> judge;
    int num;
    while(ss >> num){
        judge.emplace_back(num);
    }

    vector<vector<int>> edge(10);
    vector<int> in_degree(10);

    for(int i = 0; i < line - 1; ++i){
        string str_line;
        getline(cin, str_line);
        stringstream line_ss(str_line);
        int cur;
        int cnt = 0;
        int node = -1;
        while(line_ss >> cur){
            if(cnt != 0){
                edge[cur].emplace_back(node);
            }else{
                node = cur;
            }
            ++cnt;
        }
        in_degree[node] = cnt - 1;
    }

    queue<int> q;
    unordered_set<int> vis;
    for(int i = 1; i <= 9; ++i){
        if(in_degree[i] == 0){
            q.emplace(i);
        }
    }

    while(!q.empty()){
        int node = q.front();
        q.pop();
        vis.emplace(node);
        for(auto& next : edge[node]){
            if(--in_degree[next] == 0){
                q.emplace(next);
            }
        }
    }

    for(auto& num : judge){
        if(vis.count(num)){
            cout << 1 << " ";
        }else{
            cout << 0 << " ";
        }
    }
    cout << endl;
    return 0;
}
//第三题
//左右算一次最大数组和
//这里采用左边以i结尾,右边可以不以i+1开头
//也可以采用右边是以i开头,左边可以不以i-1结尾
int main(){
    int n;
    cin >> n;
    vector<int> nums(n);
    for(int i = 0; i < n; ++i){
        cin >> nums[i];
    }
    vector<int> dp(n);
    dp[0] = nums[0];
    for(int i = 1; i < n; ++i){
        dp[i] = max(dp[i-1], 0) + nums[i];
    }

    int res = dp.back();
    int right = nums.back();
    int right_max = right;

    for(int i = n - 2; i >= 0; --i){
        res = max(res, right_max + dp[i]);
        right = max(0, right) + nums[i];
        right_max = max(right, right_max);
    }
    cout << res << endl;
}
//第四题单调队列,滑动窗口时维护k+1个数的窗口中的最小值
int main(){
    int n, k;
    cin >> n >> k;
    vector<int> nums(n);
    for(int i = 0; i < n; ++i){
        cin >> nums[i];
    }

    deque<int> q;
    int prefix = 0;
    int res = INT_MIN;
    for(int i = 0; i < n; ++i){
        prefix += nums[i];
        while(!q.empty() && i - q.front() + 1 > k + 1){
            q.pop_front();
        }
        while(!q.empty() && nums[i] < nums[q.back()]){
            q.pop_back();
        }
        q.emplace_back(i);
        if(i >= k){
            res = max(res, prefix - nums[q.front()]);
            prefix -= nums[i - k];
        }
    }
    cout << res << endl;
}
#秋招##校招#
全部评论
大佬第一题为啥样例过了提交为0呀
5 回复 分享
发布于 2022-08-28 11:42 四川
看来测开第二题是后端第一题🤣
2 回复 分享
发布于 2022-08-28 11:55 浙江
求第一题代码
1 回复 分享
发布于 2022-08-28 11:42 陕西
第一个乘积数组咋做,看着很简单,ak不了
1 回复 分享
发布于 2022-08-28 11:43 上海
第四题有没有大佬讲一下思路
1 回复 分享
发布于 2022-08-28 11:50 黑龙江
第一题怎么做啊
1 回复 分享
发布于 2022-08-28 11:53 江苏
哎 被第三题卡了一个点 导致第四题都没做 第三题很快就写完了但无论怎么改都是0% 我本地也测不出有问题的样例 哭了 只A了前两个 字节再见了
点赞 回复 分享
发布于 2022-08-28 11:58 吉林
可以分享下代码吗
点赞 回复 分享
发布于 2022-08-28 12:00 浙江
第一题 用幂的和,一样通过0。第二题输入不会。第三题不会。第四题前缀和。只A了第四题
点赞 回复 分享
发布于 2022-08-28 12:02 浙江
请问楼主可以讲解一下第三题思路吗,跪求大佬
点赞 回复 分享
发布于 2022-08-29 00:57 江苏

相关推荐

01-14 12:08
门头沟学院 Java
神哥了不得:(非引流)1.既然发出来了简历,就稍微提一点点小建议,确实简历很不错了,练手项目可以换一些质量高的,工作内容,可以加上一些量化指标,比如第一条系统响应速度由多少变成多少,减少了百分之多少,第4条就很不错。2.广投,年前实习招募比较少了
点赞 评论 收藏
分享
评论
4
15
分享

创作者周榜

更多
牛客网
牛客企业服务