2023 – 11
瑞鼎 – 觸控演算法工程師
工作內容
1. 客戶需求專案支援
2. 觸控演算法開發與維護
3. 觸控演算法數據分析
職務類別
Q1-1. 不使用 size of 算出這個結構佔用記憶體大小
struct ST { int I; float F; }AA;
解答:
struct ST { int I; float F; }AA; int mysize(struct ST* a) { return (char*)(a + 1) - (char*)a; } int main() { AA.I = 10; AA.F = 4.5; printf("Size of AA: %dn", mysize(&AA)); return 0; } Terminal: Size of AA: 8
可以這樣解的原因是結構變數指標+1 就是獲得這個結構變數後的記憶體位置,
用 char* 算是因為 char 佔用 1 Byte。
Q1-2. 用 C 實現 $ sum_{x=0}^{2} frac{2^{x}e^{x-1}}{32}$,不能使用 division,
並把整數與浮點數部份分別存入 AA 結構。
($e^{-1}=0.367879, e^{0}=1, e=2.718281$)
解答:
#include <stdio.h> #include <stdlib.h> #include <math.h> struct ST { int I; float F; }AA; int main() { int size = 3; float *exp = malloc((size + 1) * sizeof(float)); exp[0] = 0.367897; exp[1] = 1.0; exp[2] = 2.718281; exp[3] = 0.0; for(int x=0; x<size; x++) { float bx = 2.0; bx = pow(bx, (x-5)); exp[size+1] = exp[size+1] + bx*exp[x]; } AA.I = (int)exp[size+1]; AA.F = exp[size+1] - AA.I; printf("Result int part: %d, float part: %f", AA.I, AA.F); return 0; } Terminal: Result int part: 0, float part: 0.413782
除了那個 pow 的 MATH.h 不太確定能不能用外,
其他東西還蠻直覺的。
Q2.利用指標反轉陣列 array arr[7] ={1,2,3,4,5,6,7}
解答:
void swap(int *head, int *tail) { *head = (*head)^(*tail); *tail = (*head)^(*tail); *head = (*head)^(*tail); } int main() { int arr[7] = {1,2,3,4,5,6,7}; int *head = &arr[0]; int *tail = &arr[6]; while(head<tail) { swap(head, tail); head++; tail--; } for (int i = 0; i < 7; i++) { printf("%d ", arr[i]); } return 0; } Terminal: 7 6 5 4 3 2 1
Q3. array arr={1,3,5,7,9,11,13,17} ,用二分搜尋法找出 11 的 index 為何?
解答:
int find(int* arr, int H, int T, int target) { if(H==T) {return H;} if (target < arr[(int)((H + T)/2)]) { return find(arr, H, (int)((H + T)/2), target); } else { return find(arr, (int)((H + T)/2)+1, T, target); } } int main() { int arr[8] = {1,3,5,7,9,11,13,17}; int target = 11; int res = find(arr, 0, 7, 11); printf("Index of 11: %d", res); return 0; } Terminal: Index of 11: 6
Q4.下面這段函式定義是否合法?
Q5.為什麼它合法或不合法?
int* fun(int *x){return &x*&x;} float* fun(float *x){return &x*&x;} int main() { int x1 = 4; float x2 = 4.5; int* result1 = fun(x1); float* result2 = fun(x2); return 0; }
解答:
Q4 不合法
Q5 主要有兩個原因:
第一個是沒給編譯器定義,這關係到函式多載(Function Overloading),
在 C 裡面就不允許函式多載、不同 IO 共用同一個函式名稱,
在 CPP 的話就允許,但是這邊沒說到用 gcc or g++ 編譯。
第二個是指標觀念,當函式傳入 *x,則函式內的 &x 等價 **x。
雙重指標 **x 沒有辦法直接做乘法運算。
心得
現場我有把 Q2, Q3 解出,
Q1-1肯定是我自己寫錯,Q1-2 第一眼看成積分直接空白,回來越想越不對。
Q4, Q5 可能是我 CPP 寫太多直覺以為只考函式多載,就騰了合法兩字送出,
還大膽解釋了一下。
沒想到裡面還有藏指標(汗。
以上都是英文出題,但是我沒記好英文全文,所以就憑自己印象寫出來,
如有筆誤歡迎來信指正。
這次是 104 主動投遞,人資主動打來約時間,
我也問了在職的話能不能一面線上?
結果是要到新竹現場考試,也通知筆試沒過就不面試。
行前還要我準備碩論跟部落格的報告。
這次整個面試流程大概是我提早半個小時到瑞鼎,
櫃台帶我去一樓小房間,
約定時間快到時,一位看起來像是人資(?)的人進來發考卷說寫半小時。
考完後人資將考卷拿給主管批改,過大概二十分鐘下來說我沒過資格,
還問我會不會出去?
OS:這不廢話嗎?不然你以為我怎麼出現在這裡?
嚴重懷疑你有特異功能看得到我的隱形直昇機或是隱形任意門。
雖然回家想想自己解得不甚理想,但是從頭到尾都沒見到主管這點讓我有點火大。
準備了一堆東西連主管都沒見著,幹麻不讓我線上開筆記本實況寫程式就好了?
以上。