林具有類似下面的數組:如何從ruby中的另一個單詞旁邊的數組中刪除/刪除單詞?
["a", " OR ", "bc cd", " NOT ", "e"]
在那如何刪除旁邊NOT元件?我已經展示了靜態的例子。數組中的值是動態的。我必須找到NOT運算符,並且我必須在所有數組中刪除NOT的下一個單詞。
由於
林具有類似下面的數組:如何從ruby中的另一個單詞旁邊的數組中刪除/刪除單詞?
["a", " OR ", "bc cd", " NOT ", "e"]
在那如何刪除旁邊NOT元件?我已經展示了靜態的例子。數組中的值是動態的。我必須找到NOT運算符,並且我必須在所有數組中刪除NOT的下一個單詞。
由於
對於
arr = ["a", " OR ", "bc cd", " NOT ", "e"]
方法1可以簡單地提供至陣列:大約需要O(n)的時間複雜度
new_arr = []
i = 0
while i < arr.length
break if arr[i].strip == 'NOT' # or arr[i] != ' NOT '
new_arr << arr[i]
i += 1
end
方法2:同樣爲O(n)
new_arr = []
arr.each do |a|
break if a.strip == 'NOT' # or arr[i] != ' NOT '
new_arr << a
end
方法3:取大約爲O(n),但是因爲索引方法必須找到的 '非' 的索引,然後得到值來形成範圍,它將運行2個後續循環。
arr[0...arr.index(' NOT ')] # NOTE 3 dots
另外,我會避免使用方法3,如arr.index(' NOT ')
如果在數組沒有,這將導致一個不好的範圍異常將返回零。
您的複雜度估計是關閉,在最後一種情況。它仍然是O(N)。你能找到這個錯誤嗎? :) –
@SergioTulentsev:增加了詳細的信息,謝謝。 :) – Surya
def delete_after(element, array)
if (ind = array.find_index(element)).present?
array[0...ind]
else
array
end
end
arr = ["a", " OR ", "bc cd", " NOT ", "e"]
delete_after(' NOT ', arr) # => ["a", " OR ", "bc cd", " NOT "]
@SergioTulentsev哦,是的,它不會修改自己,謝謝:) –
這不會給出預期的結果。使用3個點:'...'因爲OP想要'[「a」,「OR」,「bc cd」]',而不是''「a」,「OR」,「bc cd」,「NOT」] ' – Surya
@Surya是的,我看到*旁邊的*並提供瞭解決方案,謝謝 –
您可以使用Array#take_while
:
arr.take_while { |str| str != ' NOT ' }
#=> ["a", " OR ", "bc cd"]
海事組織,這是一個很好的答案。保持。 – Surya
我們需要'take_until',爲了對稱! :) –
有什麼預期的輸出?另外,你到目前爲止還有什麼? –
期望的輸出應該是[「a」,「OR」,「bc cd」],並且我已經嘗試過find_element_after,delete_at,index – user7348784
'[「a」,「OR」,「bc cd」 ,「不」,「e」,「f」,「g」]'?? – Surya