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:這不廢話嗎?不然你以為我怎麼出現在這裡?
嚴重懷疑你有特異功能看得到我的隱形直昇機或是隱形任意門。
雖然回家想想自己解得不甚理想,但是從頭到尾都沒見到主管這點讓我有點火大。
準備了一堆東西連主管都沒見著,幹麻不讓我線上開筆記本實況寫程式就好了?
以上。