有一个包含 1000 个大数字(也可以是 64 位数字)的数组(大于 1000 个元素的空间)。数组中的数字不一定是排序的。
我们必须在第 1001 个位置生成一个与之前的 1000 不同的唯一数字。
证明使用的方法是最好的。
我的答案(不知道这在多大程度上是正确的):对数字进行排序,然后从 0 位置开始。第 1000 位的数字 + 1 是所需的数字。
对此有更好的建议?
有一个包含 1000 个大数字(也可以是 64 位数字)的数组(大于 1000 个元素的空间)。数组中的数字不一定是排序的。
我们必须在第 1001 个位置生成一个与之前的 1000 不同的唯一数字。
证明使用的方法是最好的。
我的答案(不知道这在多大程度上是正确的):对数字进行排序,然后从 0 位置开始。第 1000 位的数字 + 1 是所需的数字。
对此有更好的建议?
创建一个包含 1001 个元素的辅助数组。将所有这些设置为 1(或 true 或 Y 或您选择的任何值)。遍历主数组,如果您在 1..1000 范围内找到一个数字,则将 0 输出(或伪造其他方式)辅助数组中的相应元素。最后,辅助数组中不为 0(或 false)的第一个元素对应于不在主数组中的数字。
这很简单,而且我认为时间复杂度为 O(n),其中 n 是主数组中的元素数。
unsigned ii,slot;
unsigned array [ NNN ];
/* allocate a histogram */
#define XXX (NNN+1);
unsigned histogram [XXX];
memset(histogram, 0, sizeof histogram);
for (ii=0; ii < NNN; ii++) {
slot = array [ii ] % XXX;
histogram[slot] += 1;
}
for (slot=0; slot < NNN; slot++) {
if ( !histogram[slot]) break;
}
/* Now, slot + k * XXX will be a
** number that does not occur in the original array */
注意:这类似于高性能标记,但至少我输入了代码......
如果对数组进行排序,则唯一编号有三种可能性:
请注意,此解决方案也适用于第 1002、第 1003 等。
尝试笨拙的 C# 实现
public class Test
{
public List<int> Sequence { get; set; }
public void GenerateFirstSequence()
{
Sequence = new List<int>();
for (var i = 0; i < 1000; i++)
{
var x = new Random().Next(0, int.MaxValue);
while (Sequence.Contains(x))
{
x = new Random().Next(0, int.MaxValue);
}
Sequence.Add(x);
}
}
public int GetNumberNotInSequence()
{
var number = Sequence.OrderBy(x => x).Max();
var mustRedefine = number == int.MaxValue && Sequence.Contains(number);
if (mustRedefine)
{
while (Sequence.Contains(number))
{
number = number - 1;
if (!Sequence.Contains(number))
return number;
}
}
return number + 1;
}
}
我对这个问题有一些想法:
您可以创建一个包含 1000 个元素的哈希表 H。假设您的数组名为 A,并且对于每个元素,我们都有 1000 的提醒:m[i] = A[i] % 1000。
如果A[i]和A[j]有冲突,那么A[i] % 1000 = A[j] % 1000。也就是说,必须存在一个索引k,没有元素的提醒1000等于到 k,那么 k 就是你要得到的数字。
如果根本没有冲突,只需选择 H[1] + 1000 作为结果。
该算法的复杂度为 O(l),其中 l 表示原始列表大小,在示例中 l = 1000