0

练习 9 - 45 分钟

你得到了一个从 1 到 10,000 的序列号列表,但它们都是乱序的;此外,列表中缺少 1 个号码。目标是找出丢失的数字。用简单的英语写出你解决这个问题的策略。尽可能简洁。

编写 Ruby 代码,将此数字列表作为参数,并返回缺失的数字。

4

1 回答 1

0

我最初的印象是某种排序函数将帮助我将数组排序,但后来我重新阅读了这个问题,它不要求排序序列,它要求一个缺失的数字。下一步要考虑的是如何确定下一个序列的数字,我想到 Chris Pine 书中的 99 瓶挑战,并意识到“n + 1”或“n - 1”将成为解决方案以及以 1 开头并以 10,000 (1..10,000) 结尾的“范围语句”。

接下来我会考虑索引,我需要使用#upto 或#each 遍历范围以确定缺失的数字以及某种允许我返回缺失值的条件语句。我将定义一个方法“missing_number”,但输入是什么?

它是一个数组吗?或者它是一个范围?我将使用数组,因为大多数时候数组是未排序的,当我测试它时,我会将输入定义为一个范围。

在做了一些研究之后,我发现了一个策略,该策略表明关键步骤是将数组中的所有数字相加并减去

与给定范围之和的差。作为一种好方法,这很有意义,因为您正在处理一个常量值,因此我选择了这种方法来通知代码。

def missing_number(array)
  grand_sum = (array.length + 1) * (array.length + 2) / 2
  sum = 0
  array.each {|n| sum += n}
  grand_sum - sum
end

x=(1..10000).to_a
x.delete rand(10000)
puts missing_number(x)
于 2013-05-28T18:45:06.683 回答