目前每年還是會參與至少一兩場的面試,若有時間我仍會持續更新本篇內容。
有些題目已經算是歷史悠久題目(約在2017~2018年左右),特別是韌體考題的部分,不確定現在是否還會這樣出題,但若是應屆畢業生,建議還是可以多多參考。
這一兩年的面試經驗,感覺比較流行的是考系統設計或是經驗相關的問題,特別是外商或新創公司。
本篇題目是從時間最早到最近的考題,由上到下來排序,希望這些題目可以幫助到大家準備面試。
韌體考題較多偏向程式語法的陷阱題、位元運算 (Bitwise Operation) 以及少數的 Coding,關於陷阱題的準備,只能建議大家多參考留意,一般工作時並不太會遇到這種題目的情況。
#define MUX(a, b) a*b
MUX(10+5, 10-5) = ?
Ans: 10 + 5 * 10 -5 = 55 (由於巨集函式的參數沒有括號,因此不會先做加減法)
unsigned long v1 = 0x00001111;
unsigned long v2 = 0x00001202;
unsigned long v;
v = v1&(~v2);
v = v | v2;
v = ?
~v = 0xffffedfd
v1&(~v2) = 0x00001111 & 0xffffedfd = 0x111
(此運算等於最低四個16位元只要是奇數都會是1)
0x111 | v2 = 0x111 | 0x1202 = 0x1313
Ans: 0x00001313
用一行程式碼判斷是否為2的冪次方
return N>0 && (N&(N-1)) == 0
int a[5] = {1, 2, 3, 4, 5};
int *p = (int*)(&a+1); // a+1 is meaning shift address of an array length.
ask: the value of *(a+1) and *(p-1)?
*(a+1) = 2
*(p-1) = 5
What's the content of array a?
int a[] = {6, 7, 8, 9, 10};
int *p=a;
*(p++)+=123;
*(++p)+=123;
a[] = {129, 7, 131, 9, 10} (這題考運算子的優先順序)
[一線IC設計廠]
int fun(int x)
{
Int count = 0;
while(x){
count++;
x = x & (x-1)
}
return count;
}
fun(456) + fun(123) + fun(789) = ?
4 + 6 + 5 = 15 (計算輸入進來的數字,其二進位表示有幾個1)
[一線IC設計廠]
#define INC(x) x*=2; x+=1
int main()
{
int i, j;
for (i = 0, j = 1; i < 5; i++)
INC(j);
printf("j = %d\n", j);
}
求J輸出值是多少?
2 (注意for迴圈沒有括號)
[2021 外商IC設計廠]
int a = 25;
int b = 30;
int ques1 = a++ + b++;
int ques2 = ++a + ++b;
printf("%d, %d", ques1, ques2);
問打印結果
右運算會較晚處理,左運算會優先處理, 因此第一行會先進行a+b,這是ques1得到的值,之後a和b各自+1。第二行會先進行a和b各自+1,然後再進行a+b,這是ques2得到的值。
Ans: 55, 59
[2021 外商IC設計廠]
請設計一段程式碼輸出如下:
        1
      121
    12321
  1234321
123454321
Ans:
int main()
{
for (int i = 0; i < 5; i++) // height
{
int print = 1;
int plus = 1;
for (int j = 0; j < 9; j++) // width
{
if (abs(4 - j) <= i)
{
printf("%d", print);
print += plus;
}
else
printf(" ");
if (j == 3) // mid
plus = -1;
}
printf("\n");
}
}
CAD 考題較多會考 Verilog 語法或是 TCL Script 和 C Shell Commands。TCL 的部分比較會考 RegExp 使用情境,而若是有 CAD 工作經驗的面試者,Verilog 語法也可能會是常被問的題目。
[2021 二線IC設計廠]
一個長字串裡,裏頭分別用空格分開了6個子字串,ex: str = [substr1 substr2 ... substr6],問如何打印第四個子字串
1. 印象中所有子字串的開頭字元和結尾字元都不一樣,可用此作為打印和結束打印的判斷。
2. 若沒限制使用Standard Function,可以用strstr()。
[2021 二線IC設計廠 ]
"?"在C語言代表的意思是什麼
用於判斷前面敘述是true or false,之後會以":"區分true和false的操作。
[2021 二線IC設計廠]
1. chmod
2. who
3. which
4. echo
以上四個Unix命令分別是做什麼用的?
[2023 一線IC設計廠 資深工程師]
請用任何一種程式語言,設計一套可以剖析 Verilog/SPICE 語意的程式。
此題主要考驗是否熟悉Regular Expression,我是用TCL去設計。
[2023 一線IC設計廠 資深工程師]
(承上延伸)若只需要取得最後兩個 Instance/Module 的名稱,該如何設計?
面試官想法是用Stack,而我是用Mod 2在迴圈內讀取名稱。
[2023 新加坡外商 資深工程師]
給一段Verilog語法,口語解釋給面試官
時至今日,因 AI 科技的發展,LeetCode 面試考題已經不再流行,逐漸轉向考概念性的問題,例如 RAII、Design Pattern 等等, 儘管真的考 LeetCode 這樣的題目,可能也只是考驗你是否有相關演算法的概念,並不要求實際實現。 而若是偏韌體一點的職缺也是會問一些作業系統相關的考題,可參考另一篇 軟韌體工程師面試考題 - 專有名詞解釋。
[2023 EDA外商]
給定一個樹狀結構,問BFS/DFS如何走訪並輸出每個節點的值。
演算法 - 廣度優先搜尋 (Breadth-First Search)
演算法 - 深度優先搜尋 (Depth-First Search)
[2023 EDA外商]
C Language Standard Container各種操作的時間複雜度,例如 list.push_back(), set.insert()。
C/C++ Time Complexity of Standard Container
[2023 EDA外商]
給定幾段字串,將這些字串轉成地圖,每個字元都有代表的意義,例如 'S' 代表起點,'E' 代表終點,'R' 代表主角,'G' 代表守衛,守衛面向的行或列是禁止行走的,
問主角能否走到地圖的終點。
可用DFS走訪。
[2024 軟體外商]
GPU 伺服器系統架構、Job Scheduler 設計 (例如有300台機器同時撒 Job,該如何排班? 又該如何分辨優先級?)。
可參考書籍 - [內行人才知道的系統設計面試指南]
[2025 AI 語言模型外商 - C++ GPU Engineer 職缺]
LLM 開發經驗相關問題、如何偵測使用者的設備、如何下載正確版本的 Binary File、在 Windows 上實作寫 Log File,會遇到那些可預期的問題。
[2026 EDA外商]
i. 問是否了解 RAII (Resource Acquisition Is Initialization) 概念。
ii. 能否列舉一些 STL Container,以及你如何挑選它們?
iii. 你會如何實作 DFS、BFS?
iv. 什麼樣的情況你會選擇用 DFS、BFS?
v. 如果DFS效能變差,你會如何優化?
vi. 如果程式執行變慢了,你會用什麼工具在執行期分析程式?
vii. 你認為 Synthesis RTL 扮演什麼樣的角色?
viii. 什麼是 Setup Time 和 Hold Time?
ix. Clock Gating 是什麼?
x. 你會怎麼管理記憶體,例如你如何 Allocate 和 Deallocate Memory?
xi. 你知道有什麼工具可以分析程式記憶體使用的狀況嗎?
xii. 你會如何設計 Unit Test?
i.
RAII (Resource Acquisition Is Initialization) 是一種C++ 的資源管理方式,把「資源的生命週期」綁定在「物件的生命週期」上。
ii.
vector:連續記憶體、cache friendly、O(1) random access(最常用)
list:插入刪除快,但 cache locality 差
set / map:有序結構,O(log n)
unordered_map / set:平均 O(1),但有 hash overhead
iii.
DFS: 可以用 Recursion 或 Stack 實作。
BFS: 可以用 Queue,逐層 (level-order) 走訪。
iv.
BFS:找最短路徑(unweighted graph)
DFS:用於 exhaustive search、backtracking
DFS 記憶體較省(相較 BFS)
v.
用visited set避免重複走訪
用memorization避免重複計算
若recursion太深 改iterative (避免stack overflow)
vi.
用 profiling 工具找 hotspot (例如 gprof, perf, VTune)
分析CPU / Memory / Cache Miss
判斷是:
• Algorithm 問題
• I/O bottleneck
• Synchronization 問題
再用 logging 或細部 timing 深入分析
vii.
• RTL 描述硬體在 register-transfer level 的行為
• Synthesis 會把 RTL 轉成gate-level netlist
• 會考慮 timing / area constraint
RTL是 high-level design 到 physical implementation 的橋樑
viii.
• Setup time: clock edge前,資料要穩定的最短時間
• Hold time: clock edge後,資料要維持穩定的最短時間
ix.
• 用來降低dynamic power
• 在不需要時關閉clock signal
• 減少switching activity
Low-power design中很常見的優化技術。
x.
• 使用RAII (smart pointers)
• Unique_ptr: 單一擁有者 (最推薦)
• Shared_ptr: 多重擁有 (但有overhead)
xi.
• Valgrind: memory leak / invalid access
• AddressSanitizer: runtime memory error
• Heap profiler: 分析記憶體使用成長
xii. 可以從幾個層面來考慮:
1. 功能正確性 (Functional Correctness)
2. 邊界條件 (Edge Cases)
3. 錯誤處理 (Error handling)
4. 覆蓋率 (Coverage)
5. 自動化測試 (Automation)
[2026 EDA外商]
請實現一個 class 如同 std::vector container。
1. 定義樣板類別 template < typename T > class My_Vector { ... }
2. 成員有一個指標,可動態配置記憶體大小,以及兩個整數成員,分別是 size 和 capacity。
3. 定義建構式初始化成員,解構式釋放記憶體。
4. 實作 push_back()、erase()、size()以及 indexing operator。
template < typename T >
class vector {
public:
vector() : m_size(0), m_capacity(0), m_data(nullptr) {}
~vector() = default;
T& operator[](size_t index) {
return m_data[index];
}
void push_back(T t) {
if (m_size == m_capacity) {
m_capacity = (m_size == 0) ? 32 : m_capacity * 2;
std::unique_ptr< T[] > tmp = std::make_unique< T[] >(m_capacity);
for (size_t i = 0; i < m_size; i++)
tmp[i] = m_data[i];
m_data = std::move(tmp);
}
m_data[m_size++] = t;
}
void erase(size_t index) {
for (size_t i = index; i < m_size; i++)
m_data[i] = m_data[i + 1];
m_size--;
}
size_t size() noexcept {
return m_size;
}
void resize(size_t capacity) {
m_capacity = capacity;
m_size = capacity;
std::unique_ptr< T[] > tmp = std::make_unique< T[] >(m_capacity);
for (size_t i = 0; i < m_capacity; i++)
tmp[i] = m_data[i];
m_data = std::move(tmp);
}
[[nodiscard]]
T& front() noexcept{
return m_data[0];
}
[[nodiscard]]
T& back() noexcept{
return m_data[m_size - 1];
}
private:
size_t m_size;
size_t m_capacity;
std::unique_ptr< T[] > m_data;
};
[2026 EDA外商]
如何實現 Singleton Pattern?
將類別的建構式以 private 封裝,並提供一個 public static method 來取得該類別的唯一實例。
這樣可以確保在整個程式中,該類別只有一個實例存在,並且可以全局訪問。
Wiki 參考範例
[2026 EDA外商]
Problem 1:
棋盤題,棋盤上有種棋子可以控整行和整列,考慮棋盤的大小和棋子數量很大時,問要如何計算該類棋子控制了棋盤上多少個位子。
註: 不接受暴力解法,時間複雜度須為O(N)。
--------------------------------------------------------------------
Problem 2:
設計一個程式,可以先給定投票項目,然後再給定每個項目的投票數(需考慮輸入的項目可能是重複的,需累計),最後輸出得票最高的項目以及投票支持率,讓得票最高的有兩項以上,則輸出需照字母排序。
註: 項目可能不是單一個字串,例如 "Black Tea", "Green Tea", "Milk Tea" 都是合法的項目名稱。
Last updated: