深信服的筆試跟大廠不太一樣,除了編程題,還有選擇題、填空題,額外考察離散數學、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\n", *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了,問題應該不大 _