【问题标题】:question on array and number关于数组和数字的问题
【发布时间】:2011-03-04 21:28:25
【问题描述】:

我有一个问题 例如我们有数组

int a[]=new int[]{a1,a2,a3,a4,..........an}:

任务是用不在数组中的元素填充同一个数组 例如 a={1,3,4,5,6,7} 应该用任何数字填充 {2,8,9,12,13,90} 或其他数字,但不能用数组中的元素填充,这不能是{1,12,13,14,110},因为 1 在数组 a 谢谢

【问题讨论】:

  • 这是作业吗?到目前为止你有什么?
  • 我不明白。什么时候停止填充?您是否只给出了数组的一部分及其完整大小并且您必须完成它?请详细说明输入内容。
  • 如果允许任何数字,你可以取数组的最大值,比如 N,然后用 N+1, N+2, N+3, ...
  • @Davit 我建议你澄清问题陈述。我们在这里在黑暗中拍摄。还有你的启示——我刚刚说过。
  • 我猜他想用不在其中的数字覆盖原始数组。如果受限于O(1) 内存和O(n) 时间,这是一个有趣的问题。

标签: algorithm


【解决方案1】:

有趣的问题。

如果数组是有符号整数,我相信它在 O(n) 时间和 O(1) 空间内是可能的,没有溢出,假设长度足够小以允许这样的事情发生。

基本思路如下:

我们有 n 个数字。现在将这些数字除以 n+1,我们得到 n 个余数。因此,{0,1,2, ..., n} 中至少有一个余数必须缺失(比如 r)。我们用余数为 r 的数字填充数组。

首先,我们将 n+1 的倍数加到所有负数上,使其为正数。

接下来我们遍历数组并找到每个数的余数为 n+1。如果余数是 r,如果 a[r] 为正,我们将 a[r] 设置为 -a[r]。 (如果我们在行走时遇到负数,我们在取余数时使用否定版本。

对于余数 = n,我们还有一个额外的 int。

最后,我们再次遍历数组,看看是否有任何正数(会有一个,否则余数 = n 的额外 int 将被取消设置)。

一旦我们有了余数,就很容易用这个余数生成 n 个数字。当然,我们总是可以只生成一个数字并用它填充,因为这个问题从来没有提到任何关于唯一数字的内容。

如果数组是无符号整数,我们可能仍然可以更好地记账。

例如,我们可以尝试使用第一个 n/logn 整数作为我们的位数组来表示已看到哪些余数,并使用一些额外的 O(1) 整数来临时保存这些数字。

例如,您执行 tmp = a[0],找到余数并设置 a[0] 的适当位(首先将其设置为零之后)。 tmp = a[1],设置位等。我们永远不会在需要找到余数之前覆盖一个数字。

【讨论】:

  • 不错的解决方案,但为什么要将n 的倍数添加到负数中?为什么n
  • @IVlad: Err... 我的意思是 n+1 :) 保持其余部分相同。
  • 是的,我也认为应该是n+1 :)。干得好。
【解决方案2】:

只需获取数组中的最高和最低数字,创建一个新数组,其中包含从下限值到 n 的元素。

可以在同一个循环中获取最大和最小数字。

假设12,4,3,5,7,8,89,它将检测到 3 作为最低值,89 作为最高值。然后它创建一个新数组并用 3..89 填充它;然后丢弃旧数组。

【讨论】:

  • 我想在没有额外数组的情况下做到这一点
  • 很抱歉这是约束
  • 你必须创建一个额外的数组,因为数组的大小是静态的;好吧,取决于语言。假设它的大小不像 PHP 那样是静态的,获取最大值和最小值,然后简单地覆盖现有数组。如果这就是界限。你还没有说清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 2014-07-04
  • 2015-01-15
相关资源
最近更新 更多