###### tags: `Leetcode`
# 2024 年「資訊科技產業專案設計」課程第 3 次作業
> 貢獻者: [gnkuan0712](https://github.com/kuanyu0712) :deer:
筆記中應當包含 JD (務必列出對應公司 JD 的超連結)、分析 JD 和探討自身的匹配狀況、相關的面試題目,和文字導向的自問自答
## 簡歷
>[resume](https://drive.google.com/file/d/11LBaNio2maNdAvHGbkyT6yAGN7vzaYw8/view?usp=sharing)
## 符合自身興趣/規劃的職務
### [Software Engineer, University Graduate, 2025](https://www.google.com/about/careers/applications/jobs/results/137721392706527942-software-engineer-university-graduate-2025?q=%22Software%20Engineer%22&location=Taiwan&src=Online%2FHouse%20Ads%2FBKWS_LOC5&gad_source=1&gclid=Cj0KCQiAi_G5BhDXARIsAN5SX7rfoTdkwDSluXIyEAxWq34XEYe5Dk4L0y-_WQ7aoEH2bZOiaZiTCVUaAv3wEALw_wcB&target_level=EARLY°ree=MASTERS°ree=BACHELORS&employment_type=INTERN&employment_type=FULL_TIME)
::: spoiler 職缺需求
* Minimum qualifications:
* Bachelor's degree in Computer Science, related technical field, or equivalent practical experience.
* Experience in computer science, data structures, algorithms, and software design.
* Experience in Software Development and coding in a general purpose programming language.
* Preferred Qualification
* Master's degree or PhD in Computer Science or a related technical field.
* Experience programming in C, C++, Java, or Python.
* Experience with Unix/Linux or Windows environments, distributed systems, machine learning, information retrieval, and TCP/IP.
:::
#### 自我評估
* 符合條件:
* 有符合preferred的碩士學歷
* 有資料結構、演算法、機器學習相關能力
* 有軟體開發的經驗
* 待改善:
* 無實際TCP/IP專案經驗
* 只有在修課期間寫過Linux kernal的經驗
* 僅有少數information retrieval經驗
#### 面試題目
>Reference:
>1. [2023 台灣 Google 軟體工程師面試心得 — 刷題要刷到什麼程度才有機會通過面試](https://medium.com/yuanchiehcheng/yet-another-google-swe-%E9%9D%A2%E8%A9%A6%E5%BF%83%E5%BE%97-2023-05-18eb13a73b75)
>2. [【學長姊帶路】Google 軟體工程師 面試分享](https://www.technice.com.tw/occupation/mentor/92421/)
>3. [Google Software Engineer interview questions](https://www.glassdoor.com/Interview/Google-Software-Engineer-Interview-Questions-EI_IE9079.0,6_KO7,24.htm)
>4. [first google interview? here are some tips.](https://leetcode.com/discuss/study-guide/5315953/first-google-interview-here-are-some-tips./)
:::success
**Google**
* Timeline
* 05/12 請朋友內推
* 06/05 Phone Screen
* 06/14 onsite coding 兩關 (台灣人一英一中)
* 06/15 Google onsite coding 一關 (美國人英文面)
* 06/19 Google onsite behavior question 一關
* 06/29 收到 HR 通知說面試過程不錯,但沒有 headcount OYZ,建議轉面 L5
* 07/14 峰迴路轉有 headcount 了,最後確定 offer
* 過往面試leetcode題目
* Dynamic Programming
* Graphs: BFS/DFS
* Arrays/Lists to circular queues, BSTs, Hash tables, B-Trees, and Red-Black trees
* Linked Lists: Reverse a linked list, detect a cycle, or merge sorted lists.
* dsa questions , trees ,graphs,dp
* transactions, hashing, graphs
* Implement linked list in hashmaps
* (LeetCode 121. Best Time to Buy and Sell Stock) You are given a list of stock prices throughout the day. Write a function to find the maximum profit you can make by buying and selling the stock once. You must buy before selling. For example: Input: prices = [7,1,5,3,6,4] Output: 5 Explanation: Buy at price = 1 and sell at price = 6, profit = 6-1 = 5.
* Behavior questions
* How do you deal with conflicts between your teammate?
* what is your strength ?
* How do you cope in urgent requests
* What are your career aspirations, where do you see yourself in 5 years.
* Describe how google makes money.
* What is the challenging thing you faced during your previous job?
* Tell me about yourself
:::
> 額外資訊: [Google薪資](https://www.levels.fyi/companies/google/salaries/software-engineer/levels/l3/locations/taiwan)
---
### [Yahoo! - Software Dev Engineer](https://ouryahoo.wd5.myworkdayjobs.com/careers/job/Ireland---Remote/Software-Dev-Engineer-I_JR0025064)
::: spoiler 職缺需求
* An Ideal Candidate Should Have...
* Bachelor’s degree or Master’s degree.
* A passion for software development and a desire to constantly learn and improve
* Demonstrated Experience with Java
* Deep understanding of Java/J2EE and other supporting back-end technologies
* Experience with unit and integration testing and writing clean code
* Understanding of REST APIs, OOP, and related best practices
* Knowledge of architecture and design patterns and anti-patterns
* Good knowledge of SQL or NOSQL databases techniques
* The ability to deliver results in a fast-paced, deadline-driven environment that requires ability to handle multiple tasks simultaneously without compromising quality
* Strong interpersonal skills and the ability to work independently as well as in a team environment
* What Would Be Nice...
* An eye for constant improvement of development processes and developer productivity
* Understanding of OS fundamentals, command line tools, and basic shell scripting
* Good knowledge and experience with big data technologies
* Experience with building robust, scalable, distributed services;
* Experience of GIT and of general configuration management methodologies
* Understanding of Test Driven Development
* Knowledge and experience of agile methodologies
* Experience with Cloud Technologies (AWS or Kubernetes desirable)
* Knowledge of continuous integration and continuous deployment to a cloud based service such as AWS
* Good knowledge of event-driven and asynchronous coding in at least ES6 JavaScript
* Experience with frontend frameworks such as Ember.js, React, Next.js, Angular
* Experience with CSS preprocessors such as SASS, LESS, etc.
* Experience with Acceptance and E2E browser testing
:::
#### 自我評估
* 符合條件:
* 學歷
* 理解並實作過 OS fundamentals, command line tools, and basic shell scripting
* 有 Java 經驗
* 了解APIs, OOP
* 有寫過frontend frameworks,但我是用Vue.js
* 待改善:
* 無寫過SQL or NOSQL databases經驗
* 無building robust, scalable, distributed services經驗
* 無Cloud Technologies經驗
#### 面試題目
>Reference:
>[2023 Yahoo! Software Engineer 軟體工程師面試心得](https://medium.com/@hogan.tech/2023-yahoo-software-engineer-%E8%BB%9F%E9%AB%94%E5%B7%A5%E7%A8%8B%E5%B8%AB%E9%9D%A2%E8%A9%A6%E5%BF%83%E5%BE%97-a8df9ef0b360)
:::success
**Yahoo!**
* 工作地點: 愛爾蘭 Ireland - Remote
* 需on-call
* 面試流程:
* 第 0 關 HR Phone Call
* 第 1 關 Online Interview (2 hr)
* 第2關 Onsite Interview (4.5 hr)
* HR 通知通過面試
* 台灣口頭Offer
* 美國總部實體 Offer
第一部分: 針對履歷的經歷去做詳細的詢問
1. 為什麼選擇技術 Flutter 而不是選擇 React Native?
2. 為什麼選擇使用 Tailwind 有哪些好處與壞處?
3. 為什麼要使用MonoRepo,有遇到哪些困難點?
第二部分: 對前後端知識去做問答
* JavaScript Async Await
* JavaScript Higher Order Function
第三部分:HTML、CSS 切版
第四部分:資料結構與演算法
* 我有刷題的習慣,通常刷題是使用 Python ,不過比較簡單可以直覺寫出來的題目,我則是使用 JavaScript。
* 總共有三個題目,個人體感是一題 Easy 兩題 Medium,第一題的熱身題是經典題,這邊直接快速的使用JavaScript 給兩個解法,包含Brute Force 以及 Map Set。
* 第二題與第三題我都有點忘了,但是都有使用到遞迴函式,第三題也是看到題目的當下就有印象是 Backtracking 的題目,也因為刷題的時候比較熟悉 Python 的語法,也有詢問面試官可不可以使用 Python,最後也有提前把第二題以及第三題都寫完。
第五部分:JavaScript Dom 操作
第六部分:Behavior Question
:::
---
### [2025 Software Engineer Campus Hire of Engineering Rotation Program](https://jobs.dell.com/en/job/taipei/2025-software-engineer-campus-hire-of-engineering-rotation-program/375/68811475216)
:::spoiler 職缺需求
* Essential Requirements
* Master’s degree in Computer Science, Engineering or related fields with a graduation date between February 2024 and July 2025
* Good knowledge of programming languages; operating systems; firmware; BIOS; device drivers; databases; system, network, operating system, and application administration; embedded software/firmware; tools and utilities, as applicable
* Knowledge of server, storage, networking and client technologies
* Ability to code/debug moderately sophisticated programs using design specifications
* Knowledge of software architectures and applications
* Desirable Requirements
* First-hand experience gathered during an internship, student job or related professional role
:::
#### 自我評估
* 符合條件
* 學歷
* 有 programming languages C/C++、Python經驗
* 對 OS、network 有基本瞭解
* 待改善:
* 無大型軟體的開發與 debug 經驗
* 無firmware; BIOS經驗
#### 面試題目
>Reference: [Dell Technologies Software Engineer interview questions](https://www.glassdoor.com/Interview/Dell-Technologies-Software-Engineer-Interview-Questions-EI_IE1327.0,17_KO18,35.htm)
>[新鮮人面試心得 (MTK/A10/Dell/Synology)](https://www.ptt.cc/bbs/Tech_Job/M.1555603463.A.F2A.html)
:::success
**Dell**
* 該職缺特色: 三年rotation換組的計畫
* 優點: 能夠每一年都換到不同組,執行不同的專案
* 缺點: 主管可能不會放太多資源在你身上
* 第一關都是主管面試,氣氛很好,沒有問技術問題,都是行為面試: 經歷,修過哪些課,做過的 project ...
* 第二關是工程師,兩位面試官都很年輕,問了幾個簡單的白板題,因為不難,所以很快就解出來
a. 給定 n, 給出 n*(n-1)*…*1 的乘積, 分別用 loop / recursive 去作
b. Leetcode 1 - Two sum
c. 給第一個 array 和一個數字 n, 找出所有比 n 大的數字和他的 index
* 其他分享的leetcode題目
* What are the OOP concepts?
* OS Domain question. C Domain question.
* Print from 1 to 100 without loop
* What projects have you worked on?
:::
## 模擬面試
😎:interviewer
🙂:interviewee
### 第一題
>題目描述
有一座大型博物館,其地圖是一個𝑚×𝑛的二維陣列 grid,由 '1' 和 '0' 組成,其中: '1' 代表展覽區域、'0' 代表走道
展覽區域可以水平或垂直連接形成一個連續的展覽區。假設所有四邊都是走道,請計算地圖中有多少個獨立的展覽區域。
😎:博物館中設置展覽區域的管理系統如何區分彼此獨立的展覽區?
🙂:這可以建模成一個圖的遍歷問題,博物館地圖可以看作是一個二維網格,其中每個展覽區域都是圖中的節點,節點之間的邊代表展覽區域的連接。
😎:具體怎麼實現?
🙂:可以使用DFS或BFS。掃過整個網格,遇到展覽區域,值為 '1'時進行搜尋,將該展覽區域以及所有連接的展覽區域標記為已訪問。每次啟動新的搜尋,計數加 1,代表發現了一個新的展覽區。
😎:DFS 和 BFS 的時間複雜度如何?
🙂:假設地圖大小為𝑚×𝑛時間複雜度都是𝑂(𝑚×𝑛),因為每個節點最多會被訪問一次。
😎:這裡要考慮什麼邊界條件?
🙂:例如:
* 地圖為空的情況。
* 整個地圖都是走道(全為 '0')。
* 單列或單行地圖。
* 當地圖的邊界有展覽區域時,確認搜尋不會越界。
😎:如果我們改用動態規劃來解決這個問題,可以怎麼設計?
🙂:可以用一個額外的矩陣來記錄每個點屬於哪個展覽區,並用迴圈逐步標記連通區域。不過這樣的空間複雜度會更高,實際上這裡用 DFS 或 BFS 更直觀且高效。
😎:你能實現嗎?
🙂:以下是我實作的code
```
void dfs(vector<vector<char>>& grid, int i, int j){
if( i<0 || i>=grid.size() || j<0 || j>=grid[0].size()||grid[i][j]=='0'){
return;
}
grid[i][j] = '0';
dfs(grid, i-1, j); //left
dfs(grid, i+1, j); //right
dfs(grid, i, j+1); //up
dfs(grid, i, j-1); //down
}
int numIslands(vector<vector<char>>& grid) {
int row = grid.size();
int column = grid[0].size();
int islands = 0;
for(int i = 0; i < row; i++){
for(int j = 0; j < column; j++){
if(grid[i][j] == '1'){
islands++;
dfs(grid, i, j);
}
}
}
return islands;
}
```
😎:好的,謝謝
### 第二題
>題目描述
你是一位歷史學家,正在研究古代城市的建築高度記錄,這些建築高度被記錄成一個整數序列 heights。
你的目標是從這些建築中找到一個子序列,使其高度從低到高嚴格遞增,並且這個子序列的長度盡可能長。請返回這個子序列的最大長度。
😎:你認為要如何找出歷史記錄中最長的遞增建築高度序列?
🙂:我們可以將這個問題看作是一個經典的動態規劃問題,或者使用一個更優化的二分搜索解法來求解。目標是找到序列中每個建築可以擴展的最大子序列。
😎:你會怎麼實現這個過程?
🙂:我們可以使用一個動態構建的 dp 陣列來記錄目前找到的最長遞增子序列:
1. 遍歷高度記錄 heights 中的每一個值。
2. 使用二分搜索找到 dp 中第一個大於等於該值的位置,更新該位置的值以維持遞增。
3. 如果該值比 dp 中所有值都大,則將其添加到 dp 的末尾。
4. 最後,dp 的長度就是最長遞增子序列的長度。
😎:為什麼要使用二分搜索?
🙂:二分搜索可以將查找位置的時間複雜度從 𝑂(𝑛)優化到 𝑂(log 𝑛),整體時間複雜度為 𝑂(𝑛 log𝑛)。
😎:那邊界條件和輸入可能有什麼特別情況需要考慮?
🙂:需要考慮以下情況:
1. 如果 heights 是空陣列,直接返回 0。
2. 如果所有建築高度都相同,則最長遞增子序列的長度為 1。
3. 如果輸入只有一個建築高度,則結果為 1。
😎:能簡單解釋一下實現細節嗎?
🙂:以下是 C++ 的實現:
```
int lengthOfLIS(vector<int>& heights) {
vector<int> dp;
for (auto& height : heights) {
auto it = lower_bound(dp.begin(), dp.end(), height); // 找到第一個大於等於 height 的位置
if (it == dp.end()) {
dp.push_back(height); // 沒有比 height 更大的,擴展子序列
} else {
*it = height; // 更新該位置以縮小後續擴展的可能性
}
}
return dp.size(); // dp 的長度即為最長遞增子序列的長度
}
```
😎:這裡的 lower_bound 有什麼作用?
🙂:lower_bound 是 C++ STL 提供的一個函數,用於在已排序的序列中找到第一個不小於目標值的位置。它的時間複雜度是 𝑂(log𝑛)
。
😎:好的,你能舉一個例子,說明是如何執行的嗎?
🙂:例如,對於輸入 heights = [3, 10, 2, 1, 20],執行步驟如下:
1. 初始 dp = []
2. 插入 3,dp = [3]
3. 插入 10,dp = [3, 10]
4. 插入 2,更新 dp = [2, 10]
5. 插入 1,更新 dp = [1, 10]
6. 插入 20,dp = [1, 10, 20]
最後 dp.size() 為 3,代表最長遞增子序列的長度為 3。
😎:好的,謝謝
### 第三題
>題目描述
有一座大型城市,它的路燈分佈圖可以用一棵二元樹表示,其中每個節點代表一盞路燈,節點的值表示該路燈的亮度(整數)。
你的任務是模擬城市燈光檢測系統,按照路燈的高度層級(從上到下),逐層收集每層的路燈亮度數據,並返回這些數據。每層的路燈亮度需要從左到右排列。
😎:城市燈光檢測系統是怎麼逐層收集路燈亮度的?
🙂:這可以看作一個典型的二元樹的層序遍歷問題。我們需要用廣度優先搜尋(BFS),從根節點開始,逐層訪問二元樹的節點並記錄每層的亮度值。
😎:具體的實現方法是什麼?
🙂:我們可以使用一個queue來輔助實現 BFS:
1. 首先將根節點加入queue。
2. 每次處理queue中的所有節點(即當前層的節點),記錄這些節點的值,並將它們的子節點加入queue。
3. 重複直到queue為空。
😎:如何處理空樹的情況?
🙂:如果根節點為空,直接返回空的結果列表。
😎:好的可以開始寫code了!
🙂:以下是 C++ 的實現:
```
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
if (!root) return result; // 如果樹是空的,直接返回空的結果
queue<TreeNode*> q;
q.push(root); // 將根節點放入隊列
while (!q.empty()) {
int size = q.size(); // 當前層的節點數量
vector<int> level; // 存放當前層的節點值
for (int i = 0; i < size; ++i) {
TreeNode* node = q.front(); // 取得隊列中的第一個節點
q.pop(); // 移除該節點
level.push_back(node->val); // 將節點值加入當前層結果
// 將左右子節點加入隊列
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
result.push_back(level); // 將當前層結果加入最終結果
}
return result;
}
```
😎:好的,謝謝