如果以「是否為奇數」的條件分組
[20,1,1,2,2,3,3,5,5,4,20,4,5].group_by { |x| x.odd? }
# 結果:
{false=>[20, 2, 2, 4, 20, 4], true=>[1, 1, 3, 3, 5, 5, 5]}
說明:
結果會回傳一個 hash,因為條件的結果只會有 true 或 false,所以 hash 就會把這兩個結果作為 key,陣列中的所有值再去看符合哪一組,就會變成對應 key 的 value
以這次題目為條件,希望直接拿陣列中「數值本身」作為條件
[20,1,1,2,2,3,3,5,5,4,20,4,5].group_by { |x| x.itself }
# 結果:
{20=>[20, 20], 1=>[1, 1], -1=>[-1, -1], 2=>[2, 2], -2=>[-2, -2], 3=>[3, 3], 5=>[5, 5, 5], 4=>[4, 4]}
說明:
雖然就是要以「數值本身」做為條件,好像就直接 group_by 就好,但它還是需要條件,在 ruby 中 itself 的方法就是會傳「數值本身」。特別的是,因為當 Hash 中出現第二同樣名稱的 key 時,後者會蓋掉前者,所以結果才看不到重複的 key,且不影響題目答案
# Given an array of integers, find the one that appears an odd number of times.There will always be only one integer that appears an odd number of times.
# 翻譯:找出在陣列中出現次數是奇數的那個數字
def find_it(seq)
end
RSpec.describe do
it "Basic tests" do
expect(find_it([20,1,-1,2,-2,3,3,5,5,1,2,4,20,4,-1,-2,5])).to eq(5)
expect(find_it([1,1,2,-2,5,2,4,4,-1,-2,5])).to eq(-1)
expect(find_it([20,1,1,2,2,3,3,5,5,4,20,4,5])).to eq(5)
expect(find_it([10])).to eq(10)
expect(find_it([1,1,1,1,1,1,10,1,1,1,1])).to eq(10)
end
end
def find_it(seq)
seq.group_by(&:itself).select { |k, v| v.length.odd? }.keys[0]
end
def find_it(seq)
seq.find{|c| seq.count(c).odd? }
end