# 幫你優面試測驗題目 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] ```