给定一个包含数字的数组,遵循以下规则:
- 如果有一个
0
,则会删除所有先前的数字和所有相邻的偶数。 - 如果有一个
1
,则会删除所有先前的数字和所有相邻的奇数。 - 如果数组的第一个元素是
1
,则可以将其删除。
我正在尝试编写一个算法来缩小数组,但我只能想出一个看起来很糟糕的解决方案:
def compress(array)
zero_or_one_index = array.rindex { |element| [0,1].include? element }
array.slice!(0, zero_or_one_index) if zero_or_one_index
deleting = true
while deleting
deleting = false
array.each_with_index do |element, index|
next if index.zero?
previous_element = array[index - 1]
if (previous_element == 0 && element.even?) ||
(previous_element == 1 && element.odd?)
array.delete_at(index)
deleting = true
break
end
end
end
array.shift if array[0] == 1
end
问题在于,如果我在数组迭代时删除元素,
delete_if
和类似的函数会开始破坏结果,因此我不得不使用 while 循环。示例:
compress([3, 2, 0]) #=> [0]
compress([2, 0, 4, 6, 7]) #=> [0,7]
compress([2, 0, 4, 1, 3, 6]) #=> [6]
compress([3, 2, 0, 4, 1, 3, 6, 8, 5]) #=> [6,8,5]
我在对cancancan进行重构以优化规则定义过程中,遇到了这个问题。