DBC练习9 - 计算缺失的数字

时间:2013-05-28 18:44:25

标签: ruby

练习9-45分钟

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

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

1 个答案:

答案 0 :(得分: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)