我正在尝试找到与remove_range
相当的东西(当然不存在),如下所示。似乎没有简单的方法来实现此功能。
a = [0,2,8,2,4,5,]
b = a.remove_range(1,2) #remove items between index 1 and 2 ,inclusively
#expect b == [0,2,4,5]
b = a.remove_range(3,4)
#expect b == [0,2,8,5]
在发布解决方案之前,请至少测试以上两种情况:)
假设范围的大小为M,此操作应该需要O(1)空间和O(N-M)时间复杂度。
编辑:
我看到人们不断发布a - a[range]
。但这是不正确的,即删除[range]中存在的元素,而不是删除属于范围的元素。
a - a[1..2]
将返回[0, 4, 5]
。但是,我们希望保留第3个元素2
。
答案 0 :(得分:3)
你可以使用Enumerable模块做一些很酷的技巧:
a = [0, 2, 8, 2, 4, 5]
r = 1..2
a.reject.with_index { |v, i| r.include?(i) } # => [0, 2, 4, 5]
请注意,这不会修改原始数组,但会返回一个新数组。如果要修改数组,可以使用reject!
。
答案 1 :(得分:2)
# Use: array.slice!(range)
a = [0,2,8,2,4,5,]
a.slice!(1..2)
a # => [0, 2, 4, 5]
或者索引范围为3到4
a.slice!(3..4)
a # => [0, 2, 8, 5]
答案 2 :(得分:1)
这是内置于数组类中的。只需减去你不想要的部分:
2.0.0-p353 :001 > ar = [0,2,8,2,4,5]
=> [0, 2, 8, 2, 4, 5]
2.0.0-p353 :002 > ar - ar[2..3]
=> [0, 4, 5]
答案 3 :(得分:1)
class Array
def remove_range(sp, ep)
raise ArgumentError if sp < 0 || ep > size - 1
slice(0...sp).concat(slice(ep+1..-1))
end
end
感谢Cary Swoveland的良好建议
答案 4 :(得分:1)
DROP TABLE IF EXISTS TESTTABLE
答案 5 :(得分:0)
a = [0,2,8,2,4,5]
j = 1
(3..4).each do |i|
j == 1 ? a.delete_at(i) : a.delete_at(i-1)
j += 1
end
b = a
[0, 2, 8, 5]
答案 6 :(得分:0)
用字符串操作尝试了一些时髦的东西。我认为它是O(4 * M),但如果这甚至是一件事!
a.join.gsub(/#{a.join[1..2]}/,'').split('').map{|i| i.to_i}
=> [0, 2, 4, 5]
a.join.gsub(/#{a.join[3..4]}/,'').split('').map{|i| i.to_i}
=> [0, 2, 8, 5]