0

为了准备迎接挑战,我正在尝试解决一堆关于 ruby​​ 的“简单”问题。但是,它们对我来说并不容易:P。

问题状态——>

# Write a function, `nearest_larger(arr, i)` which takes an array and an
# index.  The function should return another index, `j`: this should
# satisfy:
#
# (a) `arr[i] < arr[j]`, AND
# (b) there is no `j2` closer to `i` than `j` where `arr[i] < arr[j]`.
#

我不想看答案年份,所以将我目前所知道的内容倾注到编写以下代码中——

def nearest_larger(arr, i)
  j = 0
  k = i+1 
  larger_hash = {}

    while j < i 
        larger_hash[arr[j]] = j if arr[i] < arr[j]
        j +=1
    end

    while k < (arr.count - 1) do 
        larger_hash[arr[k]] = k if arr[i] < arr[k]
        k+=1
    end

    max_value = larger_hash.keys.max 


end

nearest_larger([3, 5, 6, 14, 20, 18], 2)

我很确定会有一些漂亮而简单的方法来回答这个问题,但是唉,我不知道为什么我的解决方案会吐出 NoMethodError。

非常感谢任何帮助

4

2 回答 2

0

我认为您的主要问题是您的方法中的语法错误导致它没有被定义,所以当您稍后尝试调用它时找不到它。

语法错误的原因是使用大括号{}而不是方括号[]来访问哈希内的键。

不要perl在这方面感到困惑。

访问哈希值是不同的

in perl: some_hash{a_key}
in ruby: some_hash[a_key]

这可能看起来很奇怪,因为两者都使用大括号作为哈希文字:

分配一个空的哈希文字是一样的

in perl: some_hash = {}
in ruby: some_hash = {}
于 2013-08-29T09:39:35.947 回答
0

你的问题上面已经回答了。您可能希望考虑编写方法的替代方法,以更好地利用 Ruby 的表现力,例如我在下面提出的建议。由于这不能回答您的问题,因此我考虑将其移至上面的评论中,但评论实际上并不适用于多行代码,并且无法在评论中正确格式化多行代码。

def nearest_larger(arr, i)
  # maybe check for i.abs >= arr.size
  a = arr.each_with_index.sort.map {|v , idx| v}
  j = a.index(arr[i])
  return arr.index(a[j+1]) if j+1 < arr.size
  nil    
end
于 2013-08-29T19:29:26.667 回答