2

この宿題の問題について助けが必要です。配列とインデックスを取る関数 Nearest_larger(arr, i) の書き方を教えてください。関数は別のインデックスを返す必要があります。条件は以下です。ありがとう。

This should satisfy:

(a) `arr[i] < arr[j]`, AND
(b) there is no `j2` closer to `i` than `j` where `arr[i] < arr[j]`.

同点の場合 (以下の例を参照)、2 つのインデックスのうち最も古い (最も左にある) インデックスを選択します。の数値arrが より大きい場合はarr[i]、 を返しnilます。

例:

Nearest_larger([2,3,4,8], 2).should == 3 end

私のコードは次のとおりです。

def nearest_larger(arr, idx)

  greater_nums = []

  arr.each {|element| greater_nums << element if element>idx}

    sorted_greater_nums= greater_nums.sort

    nearest_larger = sorted_greater_nums[0]

    arr.index(nearest_larger)

end

どうもありがとう。解決策については、以下の投稿を参照してください

4

1 に答える 1

3

ここには少なくとも 2 つの間違いがあります。

まず、コードは配列がソートされていると想定しているようです。(それ以外の場合、最小のものを取得するgreater_numsと、最も近いインデックスが得られるのはなぜですか?) しかし、要件 (同点の場合は最も左のインデックスを選択する) から、それは明らかに保証されていません。

さらに重要なことは、ループでは、 ではなく(渡されたインデックスeach)と比較elementしているということです。idxarr[idx]

あなたが本当にやりたいことは次のようなものだと思います:

def nearest_larger(arr, idx)
  value = arr[idx]

  # Ensure idx is actually valid.
  return nil if idx < 0 || idx >= arr.length

  left, right = [idx - 1, idx + 1]
  while (left >= 0 || right < arr.length)
    # Always check left first, per the requirement.
    return left if left >= 0 && arr[left] > value
    return right if right < arr.length && arr[right] > value

    # Incrementally move farther and farther left/right from the specified index
    # looking for a larger value.
    left, right = [left - 1, right + 1]
  end

  # This will return nil if no values were larger than arr[idx].
end
于 2013-05-16T19:13:39.470 に答える