Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数组维护顺序中的元素保存算法_Java_Algorithm_Data Structures - Fatal编程技术网

Java 数组维护顺序中的元素保存算法

Java 数组维护顺序中的元素保存算法,java,algorithm,data-structures,Java,Algorithm,Data Structures,我有一个随机数生成器,它生成从1到k的数。我还有int类型的数组(即int[]),其大小为N,其中k小于N 现在的问题是,我需要将唯一生成的数字保存到数组中(拒绝生成的重复数字),并且必须保持生成数字的顺序,而不使用任何额外的空间和复杂性。i、 同样的数组,我也需要维护生成数的顺序。这样我就可以按生成的顺序检索它们。假设不使用位图或额外数组等 这不是家庭作业。这是面试问题之一。我不应该使用任何额外的空间。他让我使用k小于N这一事实,并且需要在同一数组中反复灌输hashmap的行为。我提出了许多使

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

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


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

好的,我相信这不是家庭作业。这是解决办法。假设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。你最终会得到

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

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

如果我是您,我会1)将元素保存到排序列表中,2)完成后调用toArray()。这听起来像是家庭作业?你能告诉我们到目前为止你有什么代码吗?你在考虑什么方法?“不使用任何额外空间”似乎是不可能的任务。即使是交换,也需要占用4字节的
int-temp
。“同一数组还需要保持生成的数字的顺序”这是另一项不可能完成的任务,因为数组只能有一个顺序。@PM77-1:“不使用任何额外空间”通常指不创建长度取决于输入的数组,换句话说,使用
O(1)
额外的空间可以。在他的声明“同样的数组,我也需要保持生成的数字的顺序”中,OP有点含糊,我同意,但如果你仔细阅读整个问题,他显然只有一个顺序,随机数的生成顺序。这种算法有名字吗?@iluxa:可能你的意思是添加
N*2
,而不是
k*2
。添加
k*2
将导致该数字是否已被提取或只是生成的一个数字不明确(例如
k=2
array[1]=5
,您不知道它是否真的是5号,没有生成
1
,或者它是1号,已经生成
1
。使用
N*2
(实际上
N
就足够了),您可以检查数字是否大于
N
,如果大于,则从中减去
N
。此算法将是正确的,因为最大值为
N
,所以任何东西>
N
都是存在的标志。生成的数字只上升到k,所以我认为~k+1就足够了。但是,N*2+1000000对我来说是好事Rit生成的数字可以转到
N
k
是要生成的随机数。无论如何,我想否定数字会更好,更直观=D@PM77-1:“解决随机作业的著名iluxa算法”我想:)