9.14 深信服笔试编程题题解

// 先占个坑,题解笔试结束发
1. 第一题求最大公约数,c++和python都有现成的库可以用。C++(__gcd(int, int)), python(math.gcd(int, int)),也可以自己实现一个,并不难。
2. 贪心
#include <bits/stdc++.h>

using namespace std;

int main() {
    int n, k; cin >> n >> k;
    vector<int> v(n);
    for (int i = 0; i < n; i++) cin >> v[i];
    int ans = 0;
    for (int i = 0; i < n; i++) {
        int m = v[i], M = v[i];
        int j = i;
        while (j+1 < n && max(M, v[j+1]) - min(m, v[j+1]) <= 2*k) {
            M = max(M, v[++j]);
            m = min(m, v[j]);
        }
        if (j < n-1)
            ans ++;
        i = j;
    }
    cout << ans << endl;
    return 0;
}
3. 一个长度为n的01串,求出包含最长连续1的子串的个数。
输入n和一个长度为n的子串。
输出模1e9+7
// 1.对于包含一个特定子串t的任意字符串,假设t的左边有l个字符,右边有r个字符,则
 //     满足条件的字符串的个数为 (l+1)*(r+1)。
// 2.对于此题,我们可以枚举每一个具有最长连续1的字符串把它当作上上一句话的t。
 //   有个要注意的地方是排除重复的串,自行体会代码中带注释地方的妙处。
#include <bits/stdc++.h>
using namespace std;
int main() {
    int n; cin >> n;
    string s; cin >> s;
    s = s.substr(0, n);
    vector<int> start{-1};
    int maxLen = 0;
    for (int i = 0; i < n; i++) {
        if (s[i] == '0') continue;
        int j = i;
        while (j+1 < n && s[j+1] == s[i]) j++;
        int cnt = j-i+1;
        if (maxLen < cnt) {
            maxLen = cnt;
            start = vector<int>{-1};
            start.push_back(i);
        } else if (maxLen == cnt) {
            start.push_back(i);
        }
        i = j;
    }
    start.push_back(n);
    const int MOD = 1e9+7;
    long long ans = 0;
    for (int i = 1, iend = start.size()-1; i < iend; i++) {
        // 仔细想想l和r为什么这么取
        int l = start[i]-start[i-1], r = n-(start[i]+maxLen-1);  
        ans = (ans += 1LL*l*r) % MOD;
    }
    cout << ans << endl;
    return 0;
}

#深信服笔试题##深信服笔试#
全部评论
算法b卷,感觉选择填空对我来说略难,我这个菜鸡已经忘了很多高中数学知识了比如等比数列求和
1 回复 分享
发布于 2022-09-14 20:44 广东
我怎么只有两道算法题😂
点赞 回复 分享
发布于 2022-09-14 20:36 四川
第三题我也是这么做的,不知道为啥只能过18
2 回复 分享
发布于 2022-09-14 23:08 陕西
01那个怎么做
1 回复 分享
发布于 2022-09-14 20:53 陕西
病毒那个干傻了
点赞 回复 分享
发布于 2022-09-14 20:42 上海
01那个我题目都没太看明白...最长1子串前后到底包不包括别的1,测试用例又只给一个。
点赞 回复 分享
发布于 2022-09-14 21:03 江苏
第三题代码能a吗,我也是这个思路a不了😂
点赞 回复 分享
发布于 2022-09-14 23:44 天津
01那个,我想的是先找到最大连续1子串的长度(用前缀和),然后用滑动窗口,从第一个1开始维护左右指针,直到下一个不为1且长度大于最大子串长度则计数加一,然后滑动到下一个….有点暴力的意思…嗯菜鸡只能想到这样了,过了80%,不知道为啥,可能是边界没想好
2 回复 分享
发布于 2022-09-14 21:01 上海
最长连续1的左边个数 乘以 右边个数只过了0.09
2 回复 分享
发布于 2022-09-14 22:26 陕西
01那题感觉有点问题啊,前两题都秒了,第三题愣是没做明白😂
1 回复 分享
发布于 2022-09-14 21:02 天津
找winner+菜单菜单合理展开+日期时间格式化
点赞 回复 分享
发布于 2022-09-14 20:43 黑龙江
Hi,我在恒生电子股份有限公司帮你内推~ 您可登录链接:[campus.hundsun.com] 进行投递, 投递之前填写我的推荐码:IVKM8A 我就可以帮您内推哦~
点赞 回复 分享
发布于 2022-09-14 20:54 浙江
我感觉前面好简单 直到编程题 病毒还有那个插入删除更改字符完全不会 真的栽算法上了
点赞 回复 分享
发布于 2022-09-14 21:01 广东
很强,最后快交卷,才想起来可能有多个长度相同的子串
点赞 回复 分享
发布于 2022-09-14 21:14 陕西
楼主可以讲一下第二题是什么思路么
点赞 回复 分享
发布于 2022-09-14 23:04 辽宁
兄弟,*******从此秋招不迷路
点赞 回复 分享
发布于 2022-09-16 13:15 澳大利亚
请问01这个题为啥l,r这么取可以去重,不太明白
点赞 回复 分享
发布于 2022-09-17 09:16 浙江
请问是算法岗吗
点赞 回复 分享
发布于 2022-09-22 12:34 江苏
就那个第三题,我tm求半天最长连续1的长度,求完之后发现好像用处不大,只有一个长度太难确定个数了。又tm傻乎乎的吧每一个双指针的left和right放到一个二维vector里面,去求最大对应的left和right,搞了半天数组又越界了,我真的是服了。   选择和填空还有些没看明白,寄 谁知道还有没有机会笔试啊。
点赞 回复 分享
发布于 2022-09-29 21:12 湖南

相关推荐

10-17 12:16
同济大学 Java
7182oat:快快放弃了然后发给我,然后让我也泡他七天最后再拒掉,狠狠羞辱他一把😋
点赞 评论 收藏
分享
20 55 评论
分享
牛客网
牛客企业服务