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算法”我想:)