# 幫你優面試測驗題目
1. filter
找出 gpa>3以上的
```rb=
# @param [Array<Hash>] students
# Array of student records (array of hashes)
# @param [Array<Lambda>] filters
# Zero or more filters to apply - each filter is a lambda returning a boolean
#
# @return [Array<Hash>]
# An array of students who pass ALL provided filters
def filter(students, *filters)
# Write your code here
return nil
end
students = [
{ name: 'Thomas Edison', gpa: 3.45 },
{ name: 'Grace Hopper', gpa: 3.99 },
{ name: 'Leonardo DaVinci', gpa: 2.78 }
]
honor_roll = ->(record) { record[:gpa] > 3.0 }
honor_roll_members = filter(students, honor_roll)
puts honor_roll_members # it should print
# {:name=>"Thomas Edison", :gpa=>3.45}
# {:name=>"Grace Hopper", :gpa=>3.99}
```
```ruby=
def filter(students, *filters)
filtered_students = students
filters.each do |filter|
filtered_students = filtered_students.select { |student| filter.call(student) }
end
return filtered_students
end
```
2. pipeline
讓x值帶到下一個 function
```ruby=
def pipeline(*funcs)
-> (arg) {
# write your code here
}
end
fun = pipeline(-> (x) { x * 3 }, -> (x) { x + 1 }, -> (x) { x / 2 })
puts (fun.call(3)) # should print 5
```
```ruby=
def pipeline(*funcs)
-> (arg) {
result = arg
funcs.each { |func| result = func.call(result) }
result
}
end
fun = pipeline(-> (x) { x * 3 }, -> (x) { x + 1 }, -> (x) { x / 2 })
puts fun.call(3) # 5
```
3. 篩選學校
```ruby=
class School
# ===============================================
# 教育部學校代碼 - 學校級別對照表
# (根據學校代碼左邊算來第四碼判斷)
# ===============================================
# 5 國民中學
# 6┐
# 7┤國民小學
# 8┘
# ===============================================
# 透過學校代碼計算學校級別
def self.stage(code:)
fail 'PLEASE IMPLEMENT YOUR CODE HERE'
end
end
```
```ruby=
class School
# 透過學校代碼計算學校級別
def self.stage(code:)
case code[3].to_i
when 5
'國民中學'
when 7, 8
'國民小學'
else
'未知級別'
end
end
end
```
4. a..b sum
a~b之間的總和
```ruby=
def get_sum(a, b)
fail 'PLEASE IMPLEMENT YOUR CODE HERE'
end
a =1 b =3
```
```ruby=
def sum_of_numbers(a, b)
if a > b
a, b = b, a
end
sum = (a + b) * (b - a + 1) / 2
return sum
end
a = 999999999
b = 1
result = sum_of_numbers(a, b)
puts result # 這將輸出 500000000500000000
```
5. 說明 ruby 裡面的 yield
yield 是在 method 裡面讓給 block 區塊執行。
7. 在瀏覽器上輸入網址會發生什麼事
域名解析、TCP連接、發起HTTP請求、伺服器返回請求、瀏覽器渲染頁面
- 域名解析 瀏覽器會向 DNS 找到網域對應的IP。在發出DNS請求之前,瀏覽器會先檢查 cache
- 瀏覽器 cache
- OS cache
- Router cache
- ISP cache
- 建立TCP連接 建立過程如下
- Client 發送 SYN packet to server
- Server open port 就可以接受連線,並回傳 SYN/ACK packet
- Client 收到 SYN/ACK packet 之後向 server 發送 ACKpacket
- 瀏覽器發起 HTTP 請求 裡面會包含方法 (GET)、網址、其他需要資訊
- 伺服器處理請求並返回 伺服器處理之後,會將資料以 HTTP response 回應,其中包含了 HTTP status code、 Content-ENcoding、Cache-control、Cookie
- 瀏覽器渲染畫面 瀏覽器會解析 HTML 內容並繪製到畫面上
- 解析HTML 結果是 DOM tree,就是把HTML 文件用一個樹狀資料結構來描述。
- 取得外部資源 CSS 檔案下載並解析之後,會建造 CSSOM tree ,是一種查詢樣式規則的樹狀資料結構。
- DOM tree、CSSOM tree 組合成 render tree,裡面包含了渲染頁面所需的節點。

[參考資料](https://www.shubo.io/what-happens-when-you-type-a-url-in-the-browser-and-press-enter/)
9. 如何 MYSQL 檢測慢查詢 MYSQL 預設慢查詢是關閉的,需自行開啟慢查詢
- 查詢 slow_query_log 是否已開啟
```sql=
show variables like '%slow_query_log%';
mysql> show variables like '%slow_query_log%';
+---------------------+-----------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/localhost-slow.log |
+---------------------+-----------------------------------+
2 rows in set (0.01 sec)
```
- 開啟慢查詢指令
```sql=
set global slow_query_log='ON';
```
- 指定記錄慢查詢的時間,預設為10秒
```sql=
set global long_query_time=1;
```
- 查詢慢查詢日誌的存放位置
```sql=
show variables like '%slow_query_log_file%';
mysql> show variables like '%slow_query_log_file%';
+---------------------+-----------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------+
| slow_query_log_file | /var/lib/mysql/localhost-slow.log |
+---------------------+-----------------------------------+
1 row in set (0.01 sec)
```
[資料來源](https://reurl.cc/XmEZ8a
)
11. 請說明 render redirect_to 的不同
render 重新渲染頁面,但不會丟失送去 controller 的資料。
redirect_to 傳送到新的URL進行轉址。
12. 請說明 array#map array#each 的不同
array#map 會將結果回傳一個新陣列
array#each 計算結果會回傳到原本的參數上
14. 找出目標是由哪兩個數字相加
```ruby=
# @param {Integer[]} nums
# @param {Integer} target
# @return {Integer[]}
def two_sum(nums, target)
return
end
input : num =[2,7,11,15], targer = 9
output:[0 , 1 ]
讓num的其中兩個數字相加 = target , 答案輸出 num 的index
```
```ruby=
def two_sum(nums, target)
num_hash = {} # 創建一個哈希表來存儲數字與它們的索引
nums.each_with_index do |num, index|
complement = target - num # 計算與目標的差值
if num_hash.key?(complement)
# 如果差值在哈希表中存在,表示找到了符合條件的數字組合
return [num_hash[complement], index]
end
# 否則將當前數字及其索引存入哈希表
num_hash[num] = index
end
# 如果沒有找到符合條件的數字組合,返回空數組或其他你認為適合的值
return []
end
nums = [2, 7, 11, 15]
target = 9
result = two_sum(nums, target)
puts result.inspect # 輸出 [0, 1]
```