一、笔试介绍
奇安信是一家安全科技公司,为全球客户提供成功的网络和终端安全解决方案。奇安信笔试是奇安信公司用于招聘全职工程师的一种方式。
笔试主要测试面向对象编程、算法设计和数据结构等方面的知识。笔试分为选择题和编程题两部分。
选择题包括计算机基础、计算机网络、数据库、操作系统、数据结构和算法设计等方面,共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]为结尾的最长上升子序列长度,再将最大值输出即为最长上升子序列长度。