直至 2026 年,個人觀察是如果是線上面試,考 LeetCode 或其他任何跟 Coding 有關的題目已經沒有太大意義,因為 AI 工具輔助的關係,
頂多只是從簡單的 Pattern 設計來考驗是否有相關的概念。這點或許已經有不少的面試官也已經意識到,特別是在純軟體公司的面試場合,
因此真要是考 Coding 的題目,可能會轉向到 Onsite Interview 直接考白板題,但大多數的面試官會是直接考觀念,以及看重過去的工作經驗。
有些題目已經算是歷史悠久題目(約在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 Synthesis 就是「硬體設計編譯器」。
• 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。
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 resize) {
m_capacity = resize;
std::unique_ptr<T[]> tmp = std::make_unique<T[]>(m_capacity);
if (m_size > m_capacity) {
for (size_t i = 0; i < m_capacity; i++) {
tmp[i] = m_data[i];
}
m_size = m_capacity;
}
else {
for (size_t i = 0; i < m_size; 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: