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

相关推荐

05-21 18:32
已编辑
湖南工学院 Java
这条干货多数是给i人朋友们分享的,知道你们开不了口,可以试试我说的这些方法1.调整心态:接受初期的尴尬刚开始进入一个新环境,双方都属于一个认识对方的过程,尴尬瞬间是难免存在的。首先,你要接受尴尬,允许自己犯错,实习期本身就是来学习的,同事也不会期待你完美无缺。另外,不要太以自我为中心,其实你的尴尬瞬间也许没有人在意,是因你的对自己的关注而放大了不安全感。2.准备一些防止尴尬的话题和工作相关的,可以以请教的方式开启。比如:xx,这个表格我没有看懂,可以给我讲一下吗非工作的话题,可以聊聊中午吃什么、当地的天气如何、通勤远不远之类的。比如:附近有什么好吃的外卖吗?我刚来还不太熟悉3.每日练习,逐渐打...
sweep^0416:内向人,遇到好的领导很重要,我之前一段实习组里全e人就我一个i 刚入职第一周还会带着我聊一下,后面越来越冷落我,实在受不了,每天去到就想亖,mentor还要pua说是我融入不了集体(我真的以为是我的问题)后面我离职了,去了现在这一家公司,我的领导也是e人,但是我融入的很好,组里的人全都很好很好,也不会出现小团体什么的,所以说内向不是不融入环境的根本,就是公司跟带教的问题
点赞 评论 收藏
分享
xwqlikepsl:感觉很厉害啊,慢慢找
点赞 评论 收藏
分享
牛客583549203号:腾讯还好,况且实习而已,实习生流动性很大,属于正常现象,记得和HR委婉解释
点赞 评论 收藏
分享
评论
20
55
分享

创作者周榜

更多
牛客网
牛客企业服务