Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
Arrays 查找给定整数数组中出现偶数频率的单个整数,而其他整数出现奇数频率_Arrays_Algorithm_Data Structures_Integer - Fatal编程技术网

Arrays 查找给定整数数组中出现偶数频率的单个整数,而其他整数出现奇数频率

Arrays 查找给定整数数组中出现偶数频率的单个整数,而其他整数出现奇数频率,arrays,algorithm,data-structures,integer,Arrays,Algorithm,Data Structures,Integer,这是一个面试问题 给定一个整数数组,在数组中查找出现频率为偶数的单个整数值。所有整数都是正整数。所有其他数字出现的频率都是奇数。数组中的最大值可以是INT_max 例如,[2,8,6,2]应该返回2 如果可以找到更好的解决方案,例如O(1)空间和O(n)时间,则可以修改原始数组 我知道如何通过哈希表(遍历和计数频率)来解决它。它是O(n)时间和空间 有可能用O(1)空间或更好的时间来解决这个问题吗?鉴于这是一个面试问题,答案是:O(1)空间是可以实现的,“对于非常大的值1”: 准备一个匹配数组

这是一个面试问题

给定一个整数数组,在数组中查找出现频率为偶数的单个整数值。所有整数都是正整数。所有其他数字出现的频率都是奇数。数组中的最大值可以是INT_max

例如,[2,8,6,2]应该返回2

如果可以找到更好的解决方案,例如O(1)空间和O(n)时间,则可以修改原始数组

我知道如何通过哈希表(遍历和计数频率)来解决它。它是O(n)时间和空间


有可能用O(1)空间或更好的时间来解决这个问题吗?

鉴于这是一个面试问题,答案是:O(1)空间是可以实现的,“对于非常大的值1”:

  • 准备一个匹配数组1..INT\u所有0的最大值
  • 遍历数组时,使用整数作为matcharray的索引,加1
  • 完成后,遍历匹配数组以查找具有正偶数值的一个条目

这样做的空间很大,但与输入数组的大小无关,所以是O(1)空间。对于真正大的数据集(比如说小的值范围,但巨大的数组长度),这甚至可能是一个实际有效的解决方案。

浏览维护两个集的列表,即“偶数”集和“奇数”集。如果一个元素以前从未见过(即,如果它不在两个集合中),则将其置于“奇数”集合中。如果一个元素在一个集中,请将其移动到另一个集中。最后,“偶数”集合中应该只有一项。这可能不会很快,但对于大型列表,内存使用应该是合理的。

如果允许您对原始数组进行排序,我相信您可以在O(n lgu)时间和O(lgu)空间中进行排序,其中U是数组的最大元素。其思想如下-使用,在O(n lgu)时间和O(lgu)空间中对数组进行排序。然后,遍历数组。由于所有相等的值都是连续的,因此可以计算每个值出现的次数。一旦找到出现偶数次的值,就可以输出答案。第二次扫描需要O(n)时间和O(1)空间

如果我们假设U是一个固定常数,这就给出了一个O(n)-时间,O(1)-空间算法。如果不这样假设,那么内存使用率仍然比O(n)算法好,前提是lgu=O(n),这在大多数机器上应该是正确的。此外,空间使用率仅与最大元素的对数相同,这意味着实际空间使用率相当好。例如,在64位机器上,我们只需要足够的空间来容纳64个递归调用。这比预先分配一个巨大的阵列要好得多。此外,这意味着该算法是一个弱多项式时间算法,作为U的函数

这就是说,这确实重新排列了原始数组,从而破坏性地修改了输入。从某种意义上说,它是在欺骗,因为它使用数组本身作为O(n)存储空间


希望这有帮助

-创建一个包含整数的哈希表。叫它“古怪”什么的。因为您可能需要查看大小为INT_MAX的数组,所以只需将其设置为大小为INT_MAX的数组。初始化为0

-遍历整个阵列。你必须这样做。没有办法打败O(n)

现在您必须遍历哈希表。拉出以“2”为值的唯一条目

时间: 遍历数组一次,遍历哈希表一次,所以O(n)

空间: 只是一个INT_MAX大小的数组。或者,如果您知道数组的范围,可以将内存使用限制在该范围内


编辑:我刚刚看到你已经有了这个方法。对不起

我想我们对任务的理解不正确。它要求我们“找到数组中频率为偶数的单个整数值”。因此,假设只有一个偶数元素,解决方案是:

public static void main(String[] args) {
    int[] array = { 2, 1, 2, 4, 4 };

    int count = 0;
    for (int i : array) {
        count^=i;
    }
    System.out.println(count); // Prints 1
}

你不可能比至少检查每个元素一次(平均)做得更好,因此你不会超过O(n)次。你甚至不必计算实际频率,只需计算频率模2即可是否有要击败的目标,或者这是一个“你能做的最好的是什么”的问题?是否允许你修改原始阵列?数字是否有界限?可能是重复的,你能将其归结为大O时间和空间复杂性吗?这是O(n)时间,O(n)空间。如果是O(n)时间,这意味着可以在O(1)上扫描单个项目,这意味着可以在O(1)中检查集合并交换项目。但我看不出这是怎么回事。如何检查给定的数字是否在O(1)中的集合中?如果我们知道数字的范围(例如,所有数字都将小于100),那么我们可以使用该长度的数组来实现这一点。但我不知道如何处理O(1)中任意大的数字,这需要某种哈希集。是否允许我们使用大量内存来提供稀疏填充的哈希值,即O(1)?来自OQ:“数组中的最大数可以是INT_max”我表示歉意;我错过了那个细节!没问题:事实上,考虑到问题的性质,我认为你的输入很有价值!EugenRieck我不明白/找不到什么是matcharray?是某种特殊类型的数组吗?@brainydexter只是一个普通数组,我们用来匹配某些东西(或者在本例中是计数匹配),我使用了Eugen Rieck的技术和ur方法来获得一个不修改输入数组的解决方案。@RajendranT,还有可能是什么?@brainydexter-这个答案被删除了。这样做的目的是单独跟踪每个位的平价,结果并没有达到预期效果。但是在您的示例中,
1
以奇数频率出现。
public static void main(String[] args) {
    int[] array = { 2, 1, 2, 4, 4 };

    int count = 0;
    for (int i : array) {
        count^=i;
    }
    System.out.println(count); // Prints 1
}