【问题标题】:Algorithm in saving elements in array maintaining order在数组保持顺序中保存元素的算法
【发布时间】:2013-11-21 02:17:58
【问题描述】:

我有一个随机数生成器,它生成1 to k 之间的数字。我也有 int 类型的数组(即 int[]),其大小为 N ,其中 k 小于 N 。

现在的问题是我需要将唯一生成的数字保存到数组中(拒绝生成的重复数字)并且必须保持生成数字的顺序,而不使用任何额外的空间和O(N) 复杂性。即我同样的数组我也需要维护生成数字的顺序。这样我就可以按生成的顺序检索它们。不应该使用位图或额外的数组等。

这不是家庭作业。它的面试问题之一。我不应该使用任何额外的空间。他让我使用k 小于N 的事实,并且您需要在同一数组中灌输hashmap 的行为。我提出了许多使用额外空格的算法,但他也拒绝使用排序,但我无法维持生成的顺序。

【问题讨论】:

  • 如果我是你,我会 1) 将我的元素保存到排序列表中,以及 2) 完成后调用 toArray()。 stackoverflow.com/questions/4031572/sorted-array-list-in-java。 PS:这听起来像是功课?
  • 你能告诉我们你到目前为止有什么代码吗?您正在考虑什么方法?
  • 不使用任何额外空间”似乎是不可能完成的任务。即使是交换,您也需要占用 4 个字节的 int temp
  • "同样的数组还需要维护生成数字的顺序" 另一个不可能完成的任务,因为数组只能有一个顺序
  • @PM77-1:“不使用任何额外空间”通常是指不创建长度取决于输入的数组,换句话说,使用O(1) 额外空间是可以的。在他的声明“相同的数组我也需要维护生成的数字的顺序”中,OP 有点含糊,我同意,但如果你仔细阅读整个问题,他显然只有一个顺序,随机数的生成顺序.

标签: java algorithm data-structures


【解决方案1】:

好的,我会买这不是家庭作业。这是解决方案。假设k=3,N=5

开始:

ar[0] = 0
ar[1] = 0
ar[2] = 0
ar[3] = 0
ar[4] = 0

生成一个随机数。假设是 2。我们现在需要存储两位信息:

  • “2”是第一个随机数。
  • “2”被占用。

所以我们这样做:

ar[0] = 2
ar[1] = 0
ar[2] = 10  // 10 is any number that's larger than N.
ar[3] = 0
ar[4] = 0

下一个数字:4

ar[0] = 2
ar[1] = 4
ar[2] = 10  // taken
ar[3] = 0
ar[4] = 10  // taken

下一个数字:2

ar[2] >= 10 thus taken, try another number

下一个数字:1

ar[0] = 2
ar[1] = 14  // added 10 to signify it's taken
ar[2] = 11  // added 1 as it's the current number
ar[3] = 0
ar[4] = 10  // taken

完成。

现在,遍历数组,然后从大于 10 的所有内容中减去 10。您将得到 ​​p>

ar[0] = 2
ar[1] = 4
ar[2] = 1
ar[3] = 0
ar[4] = 0

一个警告 - 这假设随机数在[1..N] 范围内。如果他们是[0..N-1],你就得稍微调整一下。

【讨论】:

  • 这样的算法有名字吗?
  • @iluxa:可能您的意思是添加N*2 而不是k*2。添加k*2 将导致数字是否已经被占用或者它只是一个正在生成的数字(例如k=2array[1] = 5,你不知道它是否真的是数字5 而没有生成了1,或者生成了1是1,使用N*2(其实N就够了),可以检查个数是否大于N,然后减去N如果是,则从它。这个算法将是正确的,因为最大值是N,所以任何 > N 都表明存在某些东西。
  • 生成的数字只会上升到 k,所以我 ~think~ k+1 就足够了。但是,嘿,N*2 + 1000000 好功
  • 生成的号码可以转到Nk 是要生成的随机数的数量。反正我想否定数字会更好,更直观=D
  • @PM 77-1:我想“著名的 iluxa 算法用于解决随机作业” :)
猜你喜欢
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2021-02-03
  • 1970-01-01
  • 2012-04-18
  • 2010-11-28
相关资源
最近更新 更多