不定長度的 array slice 問題


#1

請問
['*', 'a', 'b', 'c', '*', 'd', 'e', 'f', 'g']
這種結構,要怎麼切片成
['*', 'a', 'b', 'c']
['*', 'd', 'e', 'f', 'g']

而且組數不是固定兩組,是變動的,而且組員也不一定是三個或四個,也是變動的。
試過先找出星號在 array 中的 index,可是就卡住了想不出來切片迴圈要怎麼寫…。


#2

… Orz" 這題好簡單不忍吐槽你 … 這邊有超過 N 種方式可以完成唄

類似 flag 式的(應該是最快的?)

require 'awesome_print'

source = ['*', 'a', 'b', 'c', '*', 'd', 'e', 'f', 'g']
ans = []
prev_index = nil

source.each_with_index do |value , index|
  next unless value == '*'
  if prev_index #push
    ans << source[prev_index..(index - 1)]
  #else = init , skip , do nothing ...
  end
  prev_index = index
end

# add tail
if prev_index && prev_index < source.length
  ans << source[prev_index..(source.length - 1)]
end

ap ans

包括奇特的解法(速度不一定快,但應該是最簡,因為有用 string obj & regex)

require 'awesome_print'

source = ['*', 'a', 'b', 'c', '*', 'd', 'e', 'f', 'g']
ans = source.join(',').scan(/\*[\w,]+/).map{|i|i.split(',')}

ap ans

還有類似 flag obj 的方式也行(很直覺,但不一定快,因為會全部 push 一次),類似

require 'awesome_print'

source = ['*', 'a', 'b', 'c', '*', 'd', 'e', 'f', 'g']
target = []
ans = [target]
is_init = true

source.each do |value|
  if value == '*'
    if is_init #skip , mark inited
      is_init = false
    else
      target = []
      ans << target
    end
  end
  target << value
end

ap ans

anyway 還有非常多方式可以完成就是 Orz" 如果感覺這都寫不好的話,或是邏輯很差,可以嘗試去 paiza : https://paiza.jp/ 領任務完成練功先?(下面有可愛漫畫的點下去就對了 X"DD 註冊後這系統還有一票試題可以解)

對我而言重點並不是效能,而是你必須要完成才行,否則你後面會沒辦法繼續做下去之類的 … 至於新手債就一直補唄,否則一直都存在的


#3

受教了,謝謝大大!


#4

我喜歡轉 string 再用 regexp 的解法


#5

其實那是最糟解,上面的解法還可以弄到更好些省記憶體,如果常寫 native lang 的人看到寫成這樣,會被噴死的,你可以把筆數增加到一百萬筆後,你會選擇不同解法的