---
# System prepended metadata

title: 幫你優面試測驗題目
tags: [面試題]

---

# 幫你優面試測驗題目
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://hackmd.io/_uploads/HJkMAeteT.png)
[參考資料](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]

```