# 台積電面試
###### 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