# 台積電面試 ###### tags: `面試經驗`、`前端` ## HackerRank 前測 ### 1. Number of characters escaped ![](https://i.imgur.com/cBv2ynS.jpg) ![](https://i.imgur.com/JtIh2Ds.jpg) 簡單來說,輸入一組字串,長度是 1 ~ 10^5,且++只由小寫字母、符號 !、符號 # 組成++,裡面有**跳脫字元(escaped character)**,但此跳脫字元有特定規則: **! + 英文字母**,例如: !a、!f ..等。而且跳脫字元要被兩個 **#** 符號包住才算! 請問此字串出現幾個跳脫字元? - input 字串一定有 "#" 且,有開始"#",就一定有結尾"#",他們是雙雙成對的(open & close) - "#" 不會有 nest 情況出現 - 若跳脫字元是以下這種情況也無法列入計算,因為 start #1 與 end #1 中間無值,start #2 與 end #2 是 po,!r則不在任何 "#" 內 ``` ##!r#po# -> return 0 ``` > 跳脫字元(escaped character) 就是 **/ + 字元** Ex: "\n" 等於 換行,Reference: https://tw.crystal-lang.org/docs/syntax_and_semantics/literals/string.html ```javascript= 'use strict'; const fs = require('fs'); process.stdin.resume(); process.stdin.setEncoding('utf-8'); let inputString = ''; let currentLine = 0; process.stdin.on('data', inputStdin => { inputString += inputStdin; }); process.stdin.on('end', _ => { inputString = inputString.replace(/\s*$/, '') .split('\n') .map(str => str.replace(/\s*$/, '')); main(); }); function readLine() { return inputString[currentLine++]; } /** * input => String * output => Number **/ // Complete the numberOfCharactersEscaped function below. function numberOfCharactersEscaped(expression) { } function main() { const ws = fs.createWriteStream(process.env.OUTPUT_PATH); const q = parseInt(readLine(), 10); for (let qItr = 0; qItr < q; qItr++) { const s = readLine(); let result = hackerrankInString(s); ws.write(result + "\n"); } ws.end(); } ``` two pointer 處理字串 or 陣列,因為有 start & end,讓每次 loop 處理的 range 不同 :::info #: 有 open,有 close,無 poundSignCount = 0 / 1 / 2 ::: :::success 判斷是跳脫字元!n: n = !, n + 1 = 英文小寫字母(用regex判斷) ::: :::warning count 計算跳脫字元數量 ::: ```javascript= // 如果此 range 在 # 與 # 之間就執行: function getEscapeCount(start, end, expression){ let regexp = /[a-z]/gi; let count = 0; while(end >= start) { // 確認是驚嘆號,且後面是英文小寫字母 if( expression.charAt(start) === '!' && expression.charAt(start + 1).match(regexp) ) { count++; } start++ } return count; } ``` ```javascript= // 如果此 range 在 # 與 # 之間就執行: function numberOfCharactersEscaped(expression){ let length = expression.length; let start, end = 0; // 兩個 pointers let poundSignCount = 0; let escapedCount = 0; if (!expression || expression.length > Math.pow(10,5)) { return 0 } while(end < length) { if(expression.charAt(end) === '#') { poundSignCount++; if(poundSignCount === 1) { // start 變成 # 的位置 start = end; } else if(poundSignCount === 2) { let count = getEscapeCount(start, end, expression); escapedCount+=count; poundSignCount = 0; start = end; } } end++; } return escapedCount } ``` [reference link](https://leetcode.com/discuss/interview-question/428240/Audible-Onlie-Assessment-for-New-Graduate-Number-of-characters-escaped) ### 2. keyboard ![](https://i.imgur.com/P59Dsnp.jpg) ![](https://i.imgur.com/L3CKSSy.png) ![](https://i.imgur.com/9b48Hfl.png) ![](https://i.imgur.com/h0HW9aY.png) 假設你每天都會透過 keypad 輸入一排數字,這排數字數量最多是9最少是1,每個數字都是範圍 1~9,所以輸入一排數字後,我們要算每次的數字輸入花了幾秒鐘,然後最後全部秒數加起來,計算出是幾秒,每個數字之間的輸入會根據keypad的距離是一格還是兩格分辨是一秒還是兩秒計算,如以上圖表: 參數1: s,是輸入的字串號碼 參數2: keypad,這次輸入鍵盤的排序或外觀 ```javascript= // 先把字串轉乘 3x3 的表格 function getKeyboard(keypad) { const keypadArray = keypad.split(""); let keypadMap = new Map(); let keypadList = [ [keypadArray[1],keypadArray[3],keypadArray[4]], // 2,4,5 [keypadArray[0],keypadArray[2],keypadArray[3],keypadArray[4],keypadArray[5]], [keypadArray[1],keypadArray[4],keypadArray[5]], [keypadArray[0],keypadArray[1],keypadArray[4],keypadArray[6],keypadArray[7]], [keypadArray[0],keypadArray[1],keypadArray[2],keypadArray[3],keypadArray[5],keypadArray[6],keypadArray[7],keypadArray[8]], [keypadArray[1],keypadArray[2],keypadArray[4],keypadArray[7],keypadArray[8]], [keypadArray[3],keypadArray[4],keypadArray[7]], [keypadArray[3],keypadArray[4],keypadArray[5],keypadArray[6],keypadArray[8]], [keypadArray[4],keypadArray[5],keypadArray[7]], ]; for(let i=0; i < keypad.length; i++) { let char = keypad.charAt(i); keypadMap.set(char, keypadList[i]); } return keypadMap; } function entryTime(s, keypad) { if(s === null || s.length === 0) { return 0 } let map = getKeyboard(keypad); let steps = 0; let prevNum = s.charAt(0); // 1-9,第一個字的號碼 for (let i = 1; i < s.length; i++) { let nextNum = s.charAt(i); // 現在的號碼與下一個號碼ㄧ樣 if(prevNum === nextNum) { continue; } if(map[prevNum].include(nextNum)) { steps += 1; } else { steps += 2; } prevNum = nextNum } return steps; } ``` [reference Link1](https://github.com/zirui-wang/LeetCode/blob/master/HackerRank/**Keyboard.java) [reference Link2](https://www.youtube.com/watch?v=XsUmSLSIUXY&ab_channel=Florian) ### 3. quiz competition ![](https://i.imgur.com/YXJkjLp.png) ![](https://i.imgur.com/gCqKOuN.png) ![](https://i.imgur.com/Yn1q0KD.png) 一個班上有 number 個學生,每一個人都有特別的天份或是知識,天份會由 1 ~ talentCount 來代表 參數1. talent: 是一個Array,裡面有n個學生,依序排隊,每一個學生都有一個天賦,用數字代表寫在Array內 參數2. talentCount: 是一個Number,天賦的種類 每一個 team,也就是 Array 至少要3人(3個talent) ## 一面 2021/04/23 2021/04/23 8:35 到台積電7廠報導,騎車過去找停車格停車,進去前跟警衛換證(身分證換訪客證),到櫃檯報到,等待時可以因為手機被櫃檯收起來,所以可以帶書去看,等到之後被叫進小房間考英文 閱讀 15 分鐘,16題,每2題1篇文章,15分鐘聽力16題,每題可以聽2次,還有寫性向測驗約100題,也是有限時間,寫完後搭車去 2&5廠(Fab 2 / Fab5),記得搭 F3 -> F8的車,方向不要做錯,之後到 2&5廠 要換證(健保卡換臨時證),主管帶著筆記本問我工作經驗與一些個性上的問題,可能要看我的抗壓性,然後也沒有問我的論文與看我帶的履歷,然後就像我介紹工作與問我有什麼想問 https://hackmd.io/@christopher404 IT 部門: https://pttcareers.com/Tech_Job/1Ig-Oug4