iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
0
自我挑戰組

Codewars Ruby Challenge in 30 Days系列 第 10

Codewars Ruby Challenge - Day 10/30

  • 分享至 

  • xImage
  •  

學習

  1. 判斷陣列是否為空的方式:其實有非常多種,像是 length, empty?, blank?,都能達到同樣目的。如果是用在 rails 做 ORM 查詢上要判斷資料是否為空,empty 與 blank 則有差異,query 的做法 empty 是用 count,blank 則是用 preloading (參考資料)
  2. Range 後的資料用 array 裝:直覺的方式是 (1..5).to_a 這樣的寫法,這次學到龍哥用另一種方法 [*(1..5)],星星符號在 ruby 內有炸開或收合的功能,所以這種方法其實是「把 range 1 到 5 所有的數字收合在陣列裡面」

題目:

# 找出缺少的數字,例如 [-3, -2, 1, 5] 少了 -1、0、2、3、4 這幾個數字。

def find_missing_numbers(array)
  # 實作內容
end

答案需要過以下測試:

RSpec.describe do
  it "找出缺少的數字" do
    expect(find_missing_numbers([-3,-2,1,4])).to eq [-1,0,2,3]
    expect(find_missing_numbers([-1,0,1,2,3,4])).to eq []
    expect(find_missing_numbers([])).to eq []
    expect(find_missing_numbers([0])).to eq []
    expect(find_missing_numbers([-4,4])).to eq [-3,-2,-1,0,1,2,3]
  end
end

我的答案

def find_missing_numbers(array)
  if array.any?
    (array[0]..array[-1]).to_a - array
  else
    []
  end
end

思路:

  1. 先找出給進 array 的最大值與最小值
  2. 用 range 產生出完整的 array,扣除給進的 array
  3. 多判斷如果是空 array,要回傳空 array

龍哥建議的答案

def find_missing_numbers(array)
  if array.length < 2
    []
  else
    [*array.min..array.max] - array
  end
end

上一篇
Codewars Ruby Challenge - Day 9/30
下一篇
Codewars Ruby Challenge - Day 11/30
系列文
Codewars Ruby Challenge in 30 Days30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言