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:這不廢話嗎?不然你以為我怎麼出現在這裡?

         嚴重懷疑你有特異功能看得到我的隱形直昇機或是隱形任意門。

雖然回家想想自己解得不甚理想,但是從頭到尾都沒見到主管這點讓我有點火大。

準備了一堆東西連主管都沒見著,幹麻不讓我線上開筆記本實況寫程式就好了?

以上。

By wuyiulin

喜歡騎單車的影像算法工程師

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *