深信服笔试09.01

算法A卷
一共3个编程题
1. 日志分析
输入:正整数 T,紧接着是 T 行字符串
输出:T 行,每个日志的潜在攻击数,结果对 1e9+7 取模。
求攻击次数,攻击次数就是字符串中包含 “swr”。
比如   输入 “swr” ,输出 1  ;输入“rws” ,输出 0
思路:
统计每个w字符 的前缀 r字符个数 和后缀 s 个数
#include<bits/stdc++.h>
using namespace std;

int main()
{
      const int mod = 1e9+7;
    int T;cin>>T;
    while(T--){
      string s;cin>>s;
      int n = s.size();
      long ans = 0;
      vector<int>pre(n+1),next(n+1);
      for(int i=0;i<n;++i){
        if(s[i]=='s')pre[i+1]=pre[i]+1;
        else pre[i+1]=pre[i];
      }
      for(int i=n-1;i>=0;--i){
        if(s[i]=='r')next[i]=next[i+1]+1; else next[i]=next[i+1];
      }
      for(int i=0;i<n;++i){
          if(s[i]=='w')ans+=((long)pre[i]*next[i])%mod;
      }
      cout<<ans<<'\n';
    }
    return 0;
}
2. 旅游人数
输入n。表示一共n个员工旅行,每个员工都有特定时间段。
之后是 n 行,每行两个正整数a, b,表示一位员工方便旅游的时间段为 [a, b]。
问最多可以同时让多少位员工觉得方便,就是输出某个时间方便人数最多的数量。

思路:
用数组表示每个时间段人数,对输入的每个区间[a,b]进行累加1,然后遍历人数,找到最大即为答案。
因为每次都会进行区间累加,如果一次次遍历效率很低。
构建差分数组,数组num[i]代表对前一个nums[i-1]的人数差。
例如 数组 x = [1,3,6,2,4]  差分数组则是 nums = [1,2,3,-4,2]
那么对区间[0,2]都+1的话,只要对数组nums操作即可:nums[0]+=1; nums[2+1]-=1;  即 nums = [2,2,3,-5,2]
之后对数组 nums 进行还原就得到了更新后的人数,即 nums[i] = nums[i]+nums[i-1];  (为了判断下标越界,多开一个空间即可)。
#include<bits/stdc++.h>
using namespace std;

int main()
{
    vector<int>nums(1e6+5);
    int n;cin>>n;
    int a,b;
    for(int i=0;i<n;++i)
    {
        cin>>a>>b;
        nums[a]+=1;
        nums[b+1]-=1;
    }
    int ans = 0;
    for(int i=1;i<nums.size();++i)
    {
        nums[i]+=nums[i-1];
        ans = max(ans,nums[i]);
    }
    cout<<ans<<'\n';
    return 0;
}
3.    五进制模拟
非常简单,模拟即可。

欢迎各位交流。
#深信服笔试题#
全部评论
您好,请问第二题可以详细说明一下吗
点赞 回复 分享
发布于 2022-09-02 09:39 广东
请问第三题为什么通过了测试用例,但提交的时候通过0%呢,大佬你碰到过这种情况吗
点赞 回复 分享
发布于 2022-09-05 21:31 北京
第二题没太看懂,大佬能再具体讲一下吗
1 回复 分享
发布于 2022-09-01 23:02 广东
第一题dp T = int(input()) def solve(x,y):     m,n = len(x), len(y)     dp = [[0]*(n+1) for _ in range(m+1)]     for i in range(m+1):         dp[i][0]=1          for i in range(1,m+1):         for j in range(1,n+1):             if x[i-1] == y[j-1]:                 dp[i][j] = dp[i-1][j-1]+dp[i-1][j]             else:                 dp[i][j] = dp[i-1][j]     return dp[m][n]%int(1e9+7) for _ in range(T):     s=input().strip()     print(solve(s,"swr"))
点赞 回复 分享
发布于 2022-09-08 17:05 广东

相关推荐

自从我室友在计算机导论课上听说了“刷&nbsp;LeetCode&nbsp;是进入大厂的敲门砖”,整个人就跟走火入魔了一样。他在宿舍门口贴了一张A4纸,上面写着:“正在&nbsp;DP,请勿打扰,否则&nbsp;Time&nbsp;Limit&nbsp;Exceeded。”日记本的扉页被他用黑色水笔加粗描了三遍:“Talk&nbsp;is&nbsp;cheap.&nbsp;Show&nbsp;me&nbsp;the&nbsp;code。”连宿舍聚餐,他都要给我们讲解:“今天的座位安排可以用回溯算法解决,但为了避免栈溢出,我建议用动态规划。来,这是状态转移方程:dp[i][j]&nbsp;代表第&nbsp;i&nbsp;个人坐在第&nbsp;j&nbsp;个位置的最优解。”我让他去楼下取个快递,他不直接去,非要在门口踱步,嘴里念念有词:“这是一个图的遍历问题。从宿舍楼(root)到驿站(target&nbsp;node),我应该用&nbsp;BFS&nbsp;还是&nbsp;DFS?嗯,求最短路径,还是广度优先好。”和同学约好出去开黑,他会提前发消息:“集合点&nbsp;(x,&nbsp;y),我们俩的路径有&nbsp;k&nbsp;个交点,为了最小化时间复杂度,应该在&nbsp;(x/2,&nbsp;y/2)&nbsp;处汇合。”有一次另一个室友低血糖犯了,让他帮忙找颗糖,他居然冷静地分析道:“别急,这是一个查找问题。零食箱是无序数组,暴力查找是&nbsp;O(n)。如果按甜度排序,我就可以用二分查找,时间复杂度降到&nbsp;O(log&nbsp;n)。”他做卫生也要讲究算法效率:“拖地是典型的岛屿问题,要先把连通的污渍区块都清理掉。倒垃圾可以用双指针法,一个指针从左往右,一个从右往左,能最快匹配垃圾分类。”现在我们宿舍的画风已经完全变了,大家不聊游戏和妹子,对话都是这样的:“你&nbsp;Two&nbsp;Sum&nbsp;刷了几遍了?”“别提了,昨天遇到一道&nbsp;Hard&nbsp;题,我连暴力解都想不出来,最后只能看题解。你呢?”“我动态规划还不行,总是找不到最优子结构。今天那道接雨水给我整麻了。”……LeetCode&nbsp;真的害了我室友!!!
老六f:编程嘉豪来了
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
11
21
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务