首页 > 解决方案 > Picking Numbers - 在 Ruby 中解决 Hacker Rank 挑战

问题描述

问题说明

给定一个整数数组,找到任意两个元素之间的绝对差小于或等于 1 的最长子数组。

示例 a = [1,1,2,2,4,4,5,5,5] 有两个子数组满足条件:[1,1,2,2] 和 [4,4,5,5,5 ]。最大长度子数组有 5 个元素。

PickNumbers 具有以下参数:

退货

我试过的

def pickingNumbers(a)
    # Write your code here
    a.sort!
    current_counter = 0
    max_counter = 0
    
    i = 0
    while i < a.size
      j = 1
      
      while (a[j].to_int - a[i].to_int) <= 1
        current_counter += 1
        j += 1
        max_counter = current_counter if current_counter > max_counter
      end
      
      i+=1
    end
    max_counter
end

input = [1,1,2,2,4,4,5,5,5]
pickingNumbers(input)

要求:

为什么上面的代码不起作用?如果有人可以解释,我将不胜感激。我正在学习解决算法挑战,我知道有很多更好的解决方案。不过,我想知道为什么这段代码不起作用!))提前致谢

标签: ruby

解决方案


您正在检查以确保i < a.size,但您没有对j.

最终,您将 j 增加到超出数组的大小并尝试访问a[9]返回 nil 的值。

nil.to_int导致错误(尽管您实际上并未说明您在问题中看到的错误)。

在 Ruby 中遍历数组的更惯用.each的方法是使用它来避免此类错误。

我还建议不要.sort!在您传入的参数上使用。最后的!bang 运算符警告您这正在修改原始数组。


推荐阅读