2022-09-01-深信服笔试71分钟100% 80左右

这回没有截图,抄了整整4页纸。
选择填空60分做了33分钟
编程第一题花了17min
第二题先8分钟随便写了个结果偷分90%,后6分钟改了下补上了10%
第三题 7分钟
之江实验室 还有 度小满 一样,每题还是优点难度的,能不能做出来都是碰运气罢了

不定选择 3’*10; -12

  1. 容器有哪些:ABCD
    A. array
    B. list
    C. hashtable
    D. deque

只选了A -3
如果是问的C++11,hashtable不选

67%17=16

  1. 选对的 (AB)
    A. 执行态可以到就绪态
    B. 就绪态可以到执行态
    C. 就绪态可以到阻塞态
    D. 阻塞态可以到创建态

-3

  1. 输出什么
    char c[]="abc\0def", *p=c;
    printf("%c",*p+4);

e

  1. (a|b)*c+[^0-9] 可以匹配出?

    A. abacc
    B. abac10
    C. c8
    D. adc

A -3
隐约记得 ^ 表示开头

  1. [76 29 55 98 21 100 66] 二叉排序树的深度为?4

  2. 崩溃还是输出

    void test(char* p){
     p="abc";
    }
    char* p="test";
    test(p);
    printf("%s\n", p);

输出test
指针是拷贝不是引用,指向的值不会被修改
-3

  1. 哪些值为true
    int a=9876,b=9867;
    printf("%d",!(b/a)); // A
    printf("%d",!!(b/a*1.0));
    printf("%d",!a||!b);
    printf("%d",a&&b); // D
    AD

填空 3*10‘;

  1. 算了这么久居然还是算错了
     unsigned short int i=(unsigned short int)(-1234);
     printf("%hu\n",i);
    不是64502,而是64302。
  • 错误:-1234的二进制是 1111 1100 0000 0000 + 1111 1111 1111 0110 = 1111 1011 1111 0110,其10进制是

  • 正确:上面把-1234写成-1034了导致少减了200,最后多加了200
    1234=0000 0100 1101 0010,
    -1234=1111 1011 0010 1110,

  1. 字节流网络字节序编码是(大)端序

  2. 取一个int里从最低有效位开始的第3个字节的值(a>>x1)&x2,其中x1、x2都是十进制。

    x1=16
    x2=255

  3. 32位系统 x86

-3

struct stru{char c;int a;};

union uni{char c; int a;};

void f(struct stru a[2]){
    const char* str="hello";
    char str2[]="he";
    struct stru st={0};
    union uni un={0};
    std::cout<<sizeof(a)<<std::endl;    // 4
    std::cout<<sizeof(str)<<std::endl;  // 4
    std::cout<<sizeof(str2)<<std::endl; // 3
    std::cout<<sizeof("hello")<<std::endl; // 6
    std::cout<<sizeof(st)<<std::endl;   // 8
    std::cout<<sizeof(un)<<std::endl;   // 4
}
  1. 29+5(4+7/3)后序遍历:2 9 * 5 4 7 3 / + * +

  2. a= , b=

    int a=5,b=6,w=1,x=2,y=3,z=4;
    (a=w>x)&&(b=y>z);
    std::cout<<a<<", "<<b;

0 6

编程 10’+13‘+17’

1.

题目:输入 n+1 个数,最后一个是 k,前 n 个数组成数组a。每次操作时判断a[0],a[1]大小,把大的放在下标0处,小的放到下标n-1处,当大的数在连续 k 次比较中都是大数时,操作结束,输出这个大数。

要求时间复杂度是 O(n),空间复杂度是O(1)。

a: [2,1000]
k: [1,999]

输入:

2 1 4 3 6 5 0 7 3

输出:

6

解释:

第一次操作得到:2 4 3 6 5 0 7 1
第二次操作得到:4 3 6 5 0 7 1 2 
第三次操作得到:4 6 5 0 7 1 2 3(4大了两回,小于k=3)
第四次操作得到:6 5 0 7 1 2 3 4
第五次操作得到:6 0 7 1 2 3 4 5
第六次操作得到:6 7 1 2 3 4 5 0(6大了三回,等于k=3,停止)
// 100% 10' 17min
#include<iostream>
#include<vector>
using namespace std;

int main(){
    int n,k,t;
    vector<int> a;
    while(cin>>t)
        a.push_back(t);
    k=a.back();
    a.pop_back();
    n=a.size();
    int i=0;
    int h=0;
    t=a[0];
    while(i<n){
        int nexti=(i+1)%n;
        if(t>a[nexti]){
            h++;
//             cout<<"t= "<<t<<", a:"<<a[nexti]<<", h="<<h<<"\n";
            if(h==k){
                cout<<t;
                return 0;
            }
        }else if(t<a[nexti]){
            h=1;
            t=a[nexti];
//             cout<<"t="<<t<<"\n";
        }
        i=nexti;
    }
    return 0;
}

2.

输入一个数n表示数组长度,再输入n个无重复的数表示数组内容。
求最大排序连续上升子段的长度(某个连续子数组排序后两两之间只相差1)

n: [1,5000]
每个数:[1,1e9]

输入:

5
3 1 2 4 6

输出:4

解释:前四个数排序后是1234,两两相差1。

// // 13' 90% 8min
// #include<iostream>
// #include<vector>
// #include<unordered_set>
// using namespace std;

// int main(){
//     int n;cin>>n;
//     vector<int> a(n);
//     for(int i=0;i<n;i++)
//         cin>>a[i];
//     unordered_set<int> s;
//     s.insert(a[0]);
//     int maxl=1;
//     for(int i=1;i<n;i++){
//         if(!s.count(a[i])&&(s.count(a[i]-1)||s.count(a[i]+1)))
//            maxl=max(maxl,(int)s.size())+1;
//         s.insert(a[i]);
//     }
//     cout<<maxl;
//     return 0;
// }

// 13' 100% 6min
#include<iostream>
#include<vector>
#include<unordered_set>
using namespace std;

int main(){
    int n;cin>>n;
    vector<int> a(n);
    for(int i=0;i<n;i++)
        cin>>a[i];
    unordered_set<int> s;
    s.insert(a[0]);
    int maxl=1;
    for(int i=1;i<n;i++){
        if(!s.count(a[i])&&(s.count(a[i]-1)||s.count(a[i]+1)))
        {
//             maxl=max(maxl,(int)s.size())+1;
            int minv=a[i]-1,maxv=a[i]+1;
            while(s.count(minv))
                minv--;
            while(s.count(maxv))
                maxv++;
//             cout<<a[i]<<", "<<minv<<", "<<maxv<<"\n";
            maxl=max(maxl,maxv-minv-1);
        }
        s.insert(a[i]);
    }
    cout<<maxl;
    return 0;
}

据说是官方题解:
图片说明

3. 病毒入侵

输入一个数 n,一个数 x,第二行输入 n 个数表示数组a。
病毒是一个数字v,病毒必须按顺序入侵数组a的每个元素。
如果 `|v-a[i]|<=x', 则病毒可以入侵成功a[i]。
病毒的值v可以任意变化,初始值页任意。
求病毒的值最少变化多少次,才可以按顺序入侵a的每个数。

n: [1,100000]
1<=a[i],x<=1e9

输入:

5 4 
4 9 6 7 8

输出:0
初始值可以设为 5、6、7、8

// 17' 100% 7min
#include<iostream>
#include<vector>
#include<unordered_set>
using namespace std;

int main(){
    int n,x;cin>>n>>x;
    vector<int> a(n);
    for(int i=0;i<n;i++)
        cin>>a[i];
    int minv=a[0],maxv=a[0];
    int c=0;
    for(int i=1;i<n;i++){
        minv=min(minv,a[i]);
        maxv=max(maxv,a[i]);
        if(maxv-minv>2*x){
            c++;
            maxv=minv=a[i];
        }
    }
    cout<<c;
    return 0;
}
#深信服##深信服校招##23秋招##23届秋招##23届秋招笔面经#
全部评论
大佬牛逼,3道编程我就ac了一道半
2 回复 分享
发布于 2022-09-01 21:15 山东
武器大师?
2 回复 分享
发布于 2022-09-01 21:41 四川
第二题的解法, 1,2,3,4,10,5 最后到5的时候也会和前面的1,2,3,4连在一起,但是这样应该就不对了吧? 还是说我想错了?
2 回复 分享
发布于 2022-09-01 22:07 天津
牛!!!!
1 回复 分享
发布于 2022-09-01 21:38 湖北
我觉得第2题解法不对。你的程序对于输入 6 1 2 2 3 3 4 会输出4
1 回复 分享
发布于 2022-09-01 22:18 上海
一道都不会...
1 回复 分享
发布于 2022-09-01 22:41 广东
牛逼 膜拜大佬
点赞 回复 分享
发布于 2022-09-01 21:15 江苏
大佬,太强了
点赞 回复 分享
发布于 2022-09-01 21:40 湖北
大佬,第三道题可以详细一点嘛
点赞 回复 分享
发布于 2022-09-01 21:53 北京
编程都很简单,前面填空算数算的头大
点赞 回复 分享
发布于 2022-09-01 22:13 新加坡
哪位大佬帮我看看第一题 只过了70
点赞 回复 分享
发布于 2022-09-01 23:08 辽宁
第二题直接sort,然后再遍历找一次是不是不给分啊
点赞 回复 分享
发布于 2022-09-02 00:24 北京
选择题第六题,char* p=“test” ,这句不会报错吗?“test”是const char*呀
点赞 回复 分享
发布于 2022-09-02 08:37 广东
有没有一种可能,代码100%,90%,100%然后前面选择填空一道没对的
点赞 回复 分享
发布于 2022-09-02 09:09 湖南
第二题明显不太对嗷, 5 8 3 1 2 4 6 10 7 答案应该是4吧 你这程序输出8 题意看起来应该是求连续子段排序后是升序的长度,不应该求子序列吧,要么题意坑,要么数据坑
点赞 回复 分享
发布于 2022-09-02 09:28 上海
{"pureText":"","imgs":[{"alt":"discuss_166****766895.jpeg","height":1623,"localSrc":"content://media/external/images/media/138082","src":"https://uploadfiles.nowcoder.com/message_images/20220902/165664256_1662083766488/discuss_1662083766895.jpeg","width":960}]}
点赞 回复 分享
发布于 2022-09-02 09:56 北京
第二题主要有两种解法   第一种是暴力搜索法,两层循环找出数组的所有子串,判断每个子串是否连续,连续就记录该子串的长度,最终输出所有记录长度的最大值,但是会超时。。。 第二种是动态规划法,dp[i]表示以a[i]结尾的最长排序连续上升子串的长度(注意该子串必须要以a[i]结尾),max_t[i]表示该子串中的最大元素值,min_t[i]该子串中的最小元素值。具体思路看代码 文本源代码如下: http://www.paste.org.cn/R0iKnYObrW
点赞 回复 分享
发布于 2022-09-02 10:36 陕西
之江实验室秋招开了吗
点赞 回复 分享
发布于 2022-09-02 13:06 重庆
第二题需要O(n^2),枚举起点往后走,记录最大值和最小值,当 l-r=max-min 时更新ans。但是这样做的前提是数组不重复……然而我AC了,呵呵
点赞 回复 分享
发布于 2022-09-02 14:37 贵州
最后一题没整出来,唉,思路基本上有,但是没整出来,太菜了
点赞 回复 分享
发布于 2022-09-02 17:09 上海

相关推荐

55 94 评论
分享
牛客网
牛客企业服务