深信服9.14笔试

1. 求最大公约数

#include <bits/stdc++.h>
using namespace std;

int a, b;
int solution() {
    while (a != b) {
        while (a > b) a = a - b;
        while (b > a) b = b - a;
    }
    return a;
}

int main() {
    while (cin >> a >> b) {
        cout << solution() << "\n";
    } 
}

2. 病毒...

#include <bits/stdc++.h>
using namespace std;

int n, x;
int solution(vector<int>& nums) {
    vector<pair<int, int>> diff; diff.reserve(n);
    for (const auto& num : nums) {
        int left = num - x < 0 ? 0 : num - x;
        int right = num + x;
        diff.push_back({left, right});
    }
    vector<pair<int, int>> overlap;
    overlap.push_back(diff[0]);
    for (int i = 1; i < n; ++i) {
        int left = max(overlap.back().first, diff[i].first);
        int right = min(overlap.back().second, diff[i].second);
        if (left <= right) {
            overlap.back().first = left;
            overlap.back().second = right;
        } else {
            overlap.push_back(diff[i]);
        }
    }
    return overlap.size() - 1;
}

int main() {
    while (cin >> n >> x) {
        vector<int> nums(n, 0);
        for (int i = 0; i < n; ++i)
            cin >> nums[i];
        cout << solution(nums) << "\n";
    }
}

3. 包含最长全1字串个数

#include <bits/stdc++.h>
using namespace std;

long long mod = 1000000007;

int solution(const string& s) {
    int n = s.size();
    int i = 0, j = -1;
    vector<int> dp(n, 0);
    dp[0] = s[0] - '0';
    int mx_len = dp[0];
    for (int i = 1; i < n; ++i) {
        if (s[i] == '1') {
            if (s[i - 1] == '1')
                dp[i] = dp[i - 1] + 1;
            else 
                dp[i] = 1;
        } else {
            dp[i] = 0;
        }
        if (dp[i] > mx_len)
            mx_len = dp[i];
    }
    if (mx_len == 0)
        return 0;
    vector<pair<int, int>> intervals;
    for (int i = 0; i < n; ++i) {
        if (dp[i] == mx_len) {
            intervals.push_back({i - mx_len + 1, i});
        }
    }
    long long  ans = 0;
    int pre_left = -1;
    for (const auto& interval : intervals) {
        auto left = interval.first;
        auto right = interval.second;
        long long cur = (long long)(left - pre_left) * (n - right);
        ans += cur;
        pre_left = left;
    }
    return ans % mod;
}

int main() {
    int n;
    while (cin >> n) {
        string s; cin >> s;
        cout << solution(s) << "\n";
    }
    return 0;
}
全部评论
老哥啥岗 怎么有3题
点赞
送花
回复
分享
发布于 2022-09-14 21:02 北京
第三题没考虑多个最长连续1...结果一直0%,调了半天最后想到解法来不及做了
点赞
送花
回复
分享
发布于 2022-09-14 21:06 新加坡
秋招专场
校招火热招聘中
官网直投
我的第3题咋都过不去 原来我只算了一个最长子串
点赞
送花
回复
分享
发布于 2022-09-14 21:08 天津
我第三题用的双指针,然后测试用例过了,运行超时
点赞
送花
回复
分享
发布于 2022-09-14 21:11 江苏
楼主能解释下37行吗,最长子串两边的数不是每个都是两种情况(取或者不取)吗,这里为什么是(left - pre_left) * (n - right) 而不是 2^(left - pre_left+n - right)
点赞
送花
回复
分享
发布于 2022-09-14 21:37 北京
第三题多个是相加吗我求的最大。。。难怪
点赞
送花
回复
分享
发布于 2022-09-14 21:42 湖北
第三题的左边界为什么要向右移动呢,计算的每一个最长子串的时候,不能包含其他最长子串吗
点赞
送花
回复
分享
发布于 2022-09-14 23:16 重庆
楼主病毒这题不是v能取任意值嘛,请问为啥要int left = num - x < 0 ? 0 : num - x;呀
点赞
送花
回复
分享
发布于 2022-09-15 00:20 河北
请问笔试完官网状态变成面试流程中,是代表笔试通过了吗?
点赞
送花
回复
分享
发布于 2022-09-22 12:22 黑龙江

相关推荐

永联 dsp工程师 15k*15 双非硕士
点赞 评论 收藏
转发
6 17 评论
分享
牛客网
牛客企业服务