2015-02-12 116 views
0

這個問題被問別的地方,但我只是想檢查,如果我做了什麼給了RSpec的情況下是適用的:合併和排序2陣列

編寫需要兩個有序陣列和生產排序的方法結合了兩者的陣列。

限制:

  • 不要那種任何地方調用。
  • 不要以任何方式修改給你的兩個數組。
  • 不要規避(2)克隆或複製兩個數組,只能修改副本。

提示:你可能需要索引到兩個數組中。

combine_arrays([1, 3, 5], [2, 4, 6]) == [1, 2, 3, 4, 5, 6] 

你可以將兩個數組合併成一個數組,然後運行一個典型的氣泡排序嗎?

def combine_arrays(arr1,arr2) 
    final = arr1 + arr2 
    sorted = true 
    while sorted do 
    sorted = false 
    (0..final.length - 2).each do |x| 
     if final[x] > final[x+1] 
     final[x], final[x+1] = final[x+1], final[x] 
     sorted = true 
     end 
    end 
    end 
    final 
end 

p combine_arrays([1,3,5],[2,4,6]) => [1, 2, 3, 4, 5, 6] 

回答

0

當然,你可以這樣做,但你忽視了一個真正的gimmee - 你給出的兩個數組已經被排序。

def combine_arrays(A1, A2) 
    retVal = Array.CreateInstance(System::Int32, A1.Length + A2.Length - 1) 
    i = 0 
    j = 0 
    while i < A1.Length | j < A2.Length 
     if i < A1.Length and self.A1(i) < self.A2(j) then 
      self.retVal(i + j) = self.A1(i) 
      i += 1 
     else 
      self.retVal(i + j) = self.A2(j) 
      j += 1 
     end 
    end 
    return retVal 
end 
+2

我喜歡這個算法,但是你的Ruby語法看起來很奇怪...... – spickermann 2015-02-12 04:35:53

+0

可能是因爲我不會說Ruby--它是一個在線轉換VB – 2015-02-12 04:36:55

+0

@DaleM我有點困惑。我仍然在學習Ruby,但是你的代碼不太清楚。如果可以的話,你會介意解釋嗎?特別是你retval = ... – Jgoo83 2015-02-12 04:46:37

0

這是基於同樣的邏輯,戴爾M的職位,但在適當的紅寶石:

def combine_arrays(arr1,arr2) 
    [].tap do |out| 
    i1 = i2 = 0 
    while i1 < arr1.size || i2 < arr2.size 
     v1 = arr1[i1] 
     v2 = arr2[i2] 
     if v1 && (!v2 || v1 < v2) 
     out << v1 
     i1 += 1 
     else 
     out << v2 
     i2 += 1 
     end 
    end 
    end 
end 

combine_arrays([1,3,5], [2,4,6]) 
0

看看這個:

def merge(arr1, arr2) 
    arr2.each { |n| arr1 = insert_into_place(arr1, n) } 
    arr1.empty? ? arr2 : arr1 
end 

def insert_into_place(array, number) 
    return [] if array.empty? 
    group = array.group_by { |n| n >= number } 
    bigger = group[true] 
    smaller = group[false] 
    if bigger.nil? 
    number > smaller.last ? smaller << number : smaller.unshift(number) 
    else 
    (smaller << number) + bigger 
    end 
end 
0

這裏是一個變體僅依靠Ruby的統計員。結果是短暫而甜蜜的。

# merge two sorted arrays into a sorted combined array 
def merge(a1, a2) 
    [].tap do |combined| 
    e1, e2 = a1.each, a2.each 
    # The following three loops terminate appropriately because 
    # StopIteration acts as a break for Kernel#loop. 
    # First, keep appending smaller element until one of 
    # the enumerators run out of data 
    loop { combined << (e1.peek <= e2.peek ? e1 : e2).next } 
    # At this point, one of these enumerators is "empty" and will 
    # break immediately. The other appends all remaining data. 
    loop { combined << e1.next } 
    loop { combined << e2.next } 
    end 
end 

第一loop保持抓住的最低兩個枚舉值,直到統計員之一用完的值。第二個loop然後追加第一個數組的枚舉數中的所有剩餘(可以是none)值,第三個loop對第二個數組的枚舉數的值相同,並且tap返回結果數組。