您的位置:

奇安信笔试

一、笔试介绍

奇安信是一家安全科技公司,为全球客户提供成功的网络和终端安全解决方案。奇安信笔试是奇安信公司用于招聘全职工程师的一种方式。

笔试主要测试面向对象编程、算法设计和数据结构等方面的知识。笔试分为选择题和编程题两部分。

选择题包括计算机基础、计算机网络、数据库、操作系统、数据结构和算法设计等方面,共50道题,答题时间为1小时。

编程题主要考察候选人的算法设计和编写能力。编程题的难度较高,需要候选人具备扎实的算法和编程基础。需要在约2小时内完成一道算法题。

二、选择题

选择题目的难度较为适中,因此考察了解的范围比较广,包括计算机基础、计算机网络、数据库、操作系统、数据结构和算法设计等方面。这里以操作系统为例,介绍一下其中的一道选择题。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char* a;
    char* b = "qi" "an" "xin";
    a = malloc(sizeof(b));
    a = b;
    printf("%s\n", a);
    return 0;
}

运行以上程序,输出的结果为:

qianxin

该程序的正确选项是:

A. 输出结果为"qi" "an" "xin"。

B. 输出结果为"qianxin"。

C. 输出结果为"qi an xin"。

D. 程序编译会出错。

正确答案是B。此题考查了对C语言中指针和数组的理解。程序中a = b会导致原来的malloc分配的内存泄露。正确的写法应该是使用strcpy函数复制字符串。

三、编程题

奇安信的编程题难度较高,需要候选人掌握高级数据结构、算法和操作系统等知识。这里以一道动态规划问题为例来介绍。

题目描述:

给定一个数组,求该数组中的最长上升子序列的长度。

输入格式:

第一行输入一个整数n,表示数组的大小,接下来一行输入n个整数表示该数组。

输出格式:

输出一个整数,表示该数组中的最长上升子序列的长度。

样例输入:

7
1 2 3 4 5 6 7

样例输出:

7
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, i, j, ans = 1;
    scanf("%d", &n);
    int arr[n], dp[n];
    for (i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
        dp[i] = 1;
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < i; j++) {
            if (arr[j] < arr[i])
                dp[i] = dp[i] > dp[j] + 1 ? dp[i] : dp[j] + 1;
        }
        ans = ans > dp[i] ? ans : dp[i];
    }
    printf("%d\n", ans);   
    return 0;
}

以上代码是正确的答案。该题考查了动态规划的思想。通过dp[i]保存以arr[i]为结尾的最长上升子序列长度,再将最大值输出即为最长上升子序列长度。