如何从数组

时间:2015-05-12 01:56:21

标签: ruby

我正在尝试找到与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

7 个答案:

答案 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]