林具有类似下面的数组:如何从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