深信服的笔试跟大厂不太一样,除了编程题,还有选择题、填空题,额外考察离散数学、C语言、数据结构、算法等知识点。编程题比较简单(虽然调了很久...
选择题
- 双向链表删除节点操作
- lowbit()代码补全:
x&(-x)
用来判断2次幂的整数:x&(-x) == x
- 复杂度分析
for (int i=0;i<n;i++) {
int j=1;
while (j<i) {
int k = j+3;
j += k;
}
}
- 命题逻辑,A、B、C三个人的话只有一个是真话,简单推导一下
- 小学奥数称球问题
填空题
- 根据二叉树先序、中序序列,求后序
- C语言union、struct字节对齐 (答错了,回头再看看)
union DATE{
long l;
char c[10];
int i;
};
struct st {
int i;
union DATE date;
double d;
};
// 求 sizeof(struct st) + sizeof(union DATE)
- 考察C语言传值与传指针
写出代码运行结果 - 考察C语言数组、数组指针
array表示数组的首地址,与&array指向同样内存地址
前者加一移动元素地址大小,后者则是移动整个数组内存大小,有点类似多维指针
例如:
char ch[3][16]; char (*p)[16] =ch; p++; //p++后,p指向ch[1][0];
p++跳转的单位是其指向的数据类型,如果指针指向一般数据类型,则++跳转到下一地址;如果指针指向多维数组的一行,++则跳转到下一行
int array[5] = {1, 2, 3, 4, 5};
int *p = (int *)(array + 1);
int *q = (int *)(array + 1);
int *r = (int *)(&array + 1);
printf("%d %d %d
", *p, *(q+1), *(r-1));
// 输出:2 3 5
- 剩下忘了
编程题
- 对数组元素操作,该元素不变,其他元素+1,问最少进行多少次操作后,所有元素相同
思路:相当于对操作的元素减1,全部都减到跟最小元素相同即可 - 替换数字序列中的数字,题目没说明是(0~9)
原始序列s (1<=len(s)<=1000000)
n次操作a b,把数字a替换为b (1<=n<=1000000)
思路:弄清楚0~9分别最后被替换成哪些数字即可
编程题都A了,问题应该不大 _