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 湖南

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
10-15 14:22
点赞 评论 收藏
分享
点赞 评论 收藏
分享
20 55 评论
分享
牛客网
牛客企业服务