当前位置: 首页 > 面试题库 >

在两个数组中搜索匹配项,没有额外的内存

魏鸿哲
2023-03-14
问题内容

前几天,我接受了亚马逊的采访,他们问我一个问题,涉及以下问题。

给定2个整数数组,其中包含任意数量的正负元素,请查找出现在两个数组中的数字。

我能够非常轻松地解决此问题,HashMaps因此它将具有O(n)计算复杂性,但是不幸的是,这还将具有O(n)空间复杂性。可以通过遍历每个数组中的所有元素而无需额外的内存来完成此操作,但这将是O(n^2)

在我解释完该HashMap方法之后,面试官问我是否可以想到一种在计算上为O(n)但不会使用任何额外内存的方法。我想不出任何动态,也无法为此找到解决方案。有没有一种方法可以在线性时间内不使用额外的内存来查找这些值?

注意:我已经在CareerCup上发布了这个问题,但是那里的每个人似乎都没有得到这样的概念,即我不需要使用它来占用额外的空间,并且必须在O(n)计算上使用它。

这是我在面试中使用的代码。它可以工作,但是空间不是O(1)。

import java.util.*;
public class ArrayFun {
    public static void main(String[] args) {

        int[] a = {1,2,3,4};
        int[] b = {2,5,6,7,3,2,2,2,2,1,2,2,2,2};
        ArrayList<Integer> matches = ArrayFun.findMatches(a,b);
        for (int i = 0;i<matches.size();++i) {
            System.out.println(matches.get(i));
        }
    }

    public static ArrayList<Integer> findMatches(int[] a, int[] b) {
        HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
        ArrayList<Integer> matches = new ArrayList<Integer>();
        for (int i = 0;i<a.length;++i) {
            map.put(a[i],0);
        }
        for (int i = 0;i<b.length;++i) {
            if (map.get(b[i]) != null && map.get(b[i]) == 0) {
                map.put(b[i],1);
                matches.add(b[i]);
            }
        }
        return matches;
    }
}

此代码将返回

1,2,3

编辑:同样,当我说没有额外的空间和O(1)时,我有点可以互换使用它们。没有多余的空间,我是说较小的占位符变量很好,但分配新数组则不行。


问题答案:

没有O(1)空间方法可以找到O(n)时间中两个未排序集合的交集。

对于无限范围的数据类型,最小排序价格为O(n ln n)。

对于范围有限的数据类型,基数排序提供了在O(n ln
n’n“)时间中进行就地基数排序的能力,其中n是数据的大小,n’是值的数量可以表示,n“与检查两个值是否在同一基数组中的开销有关。可以降低n“时间价格,以换取O(ln
n)空间价格。

在32位整数的特殊情况下,n’为2 ^ 32,n“为1,因此这将折叠为O(n)并为数十亿个记录集提供一个成功的解决方案。

对于大小不受限制的整数,n’和n“排除通过基数的O(n)时间解。



 类似资料:
  • 我试图创建一个弹性搜索查询,它必须匹配单独字段上的三个查询之一,并且还有一个额外的查询,而不是需要匹配的。执行bool查询和Must子句的问题是,它必须匹配所有3个,而使用'应该'时,它并不总是匹配所需的,除非使用minimum_should_match设置为2。在这种情况下,由于最小匹配,它在匹配3个必需文档之一的文档上不匹配。 我当前的查询是这样的(对不起,这里没有代码) 我也尝试了以下方法,

  • 问题内容: 我正在寻找给定此数组的函数, 我想寻找针头 “面包” 并得到以下结果 问题答案: 使用。您可以提供一个回调,该回调确定哪些元素保留在数组中以及哪些元素应删除。(从回调返回的值指示应删除给定的元素。)类似这样的东西: 欲获得更多信息: 返回值

  • 我有一门食谱课: 用户可以在搜索框中输入搜索词列表,我想返回匹配所有搜索词的食谱。以下是我到目前为止的代码: 但是,这将返回仅与一个或两个条件匹配的项。例如。如果用户搜索“Chef Jane”和“Donald”,它还会返回来自“Chef Callum”的东西,因为“Donald”标签存在。 如何确保返回的是完全匹配的?

  • 问题内容: 我需要在JavaScript中搜索数组。搜索将仅针对字符串的一部分进行匹配,因为该字符串将分配有其他数字。然后,我需要返回带有完整字符串的成功匹配的数组元素。 即 我需要搜索其中包含的数组元素,并且也需要在元素中提取其余文本(即)。 谢谢 问题答案: 在您的特定情况下,您可以使用一个无聊的旧柜台来做到这一点: 但是,如果您的数组是稀疏的,则可以通过适当设计的循环来更有效地执行此操作:

  • 问题内容: 我有两个numpy数组A和B。A包含唯一值,而B是A的子数组。 例如: 问题答案: 您可以使用带有- 如果您关心维护订单,也可以使用- 对于一般情况,当&是未排序的数组时,您可以在中引入选项,就像这样- 为了解决一般情况,我还会添加我最喜欢的内容- 样品运行-

  • 这是关联数组: 我知道通过使用过滤数据并比较值的正常方法。我想在中搜索以下键/值对。 理想的输出应该是来自的第一个元素,因为它booking_name=abc,pdg=保证和user_area=es st 我尝试了: 这总是返回空数组。 仅供参考-我是新的。 更新1: 我使用下面的方法来获取具有可见。对所问问题进行了类似的尝试,但未能获得理想的结果。 如何在关联数组上应用作为数组数组传递的多个过滤