【问题标题】:Optimizing hacker rank challenge 'Climbing the Leaderboard'优化黑客排名挑战“攀登排行榜”
【发布时间】:2020-02-19 03:00:38
【问题描述】:

挑战是这样的:

Alice 正在玩街机游戏,想爬到顶部 排行榜,并想跟踪她的排名。游戏使用密集 排名,所以它的排行榜是这样工作的:

得分最高的玩家在 排行榜。得分相同的玩家获得相同的排名 号码,下一个玩家收到紧随其后的 排名号。例如,排行榜上的四个玩家有 100、90、90 和 80 的高分。这些玩家将排名第一, 分别为 2、2 和 3。如果 Alice 的分数是 70、80 和 105,她 每场比赛后的排名分别为第4、第3和第1

基本上你必须在每场比赛后返回一个包含她排名的数组。我有工作代码,但它在 4 次测试中超时。这是我的代码:

def climbingLeaderboard(scores, alice)
    positions = []
    alice.each do |x|
        scores.insert(scores.index(scores.min_by { |y| (x-y).abs }) + 1, x)
        board = scores.group_by { |x| x }.sort_by { |k,v| v }.reverse
        positions << board.find_index { |k| k[0] == x } + 1
    end
    return positions
end

我想知道我可以做些什么来优化它?

【问题讨论】:

  • 我投票结束这个问题,因为它属于Code Review site
  • 提示:使用map
  • @tadman,这不是工作代码!如果scores = [100, 90, 90, 80]alice = [70, 80, 105]climbingLeaderboard(scores, alice) #=&gt; [4, 3, 1](正确),但现在scores #=&gt; [100, 100, 90, 89, 90, 80, 70],所以如果再次执行该方法将产生不正确的结果。

标签: ruby algorithm optimization


【解决方案1】:

代码

def climbingLeaderboard(scores, alice)
  uniq_scores = scores.uniq << -1
  alice.map do |alice_score|
    uniq_scores.bsearch_index { |score| alice_score >= score } + 1
  end
end

Array#bsearch_index 的计算复杂度为 O(log n),其中n = uniq_rankings.size

示例

scores = [100, 90, 90, 80]
alice  = [70, 80, 105]

climbingLeaderboard(scores, alice)
  #=> [4, 3, 1]

【讨论】:

  • 感谢您向我展示了一个有用的工具(二进制搜索 ruby​​ 方法),不幸的是它仍然没有在给定的时间限制内执行。
  • 我发现令人惊讶的是,我的方法是 O(n) 来计算 uniq_rankings 和 O(log n) 来获得排名,这似乎是下限。您收到什么消息说它没有在时间限制内执行?我在Hankerrank site 阅读了这个问题,发现分数可能为零,所以我将uniq_rankings = rankings.uniq &lt;&lt; -1 中的0 更改为-1。 (来自维多利亚的您好。)
  • thelacaning,我刚刚在hackerrank运行了这个,它通过了所有的测试。
  • 显然是好方法。只是对效率的评论:我不知道 ruby​​,但您似乎没有使用 Alice 的分数按升序提供的事实。根据输入,使用它可以获得一些增益。这种问题的问题是输入是未知的......无论如何,如果当前代码通过了测试......
  • 基本上我同意你的看法。问题是我们不知道输入。例如,让我们假设 Alice 最后 10^5 的分数对应第一个排名……在这种问题中,如果 TL 是 1,当你得到 1.01 时你是零,你是英雄,有 0.99时间得分!但同样,当你通过测试时......
猜你喜欢
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
相关资源
最近更新 更多