如何在没有循环嵌套的情况下扫描两个不同长度的数组?

时间:2014-02-09 05:58:05

标签: java

我正在研究的Java问题如下:

给定两个以升序排序的整数数组,外部和内部,如果内部的所有数字都出现在外部,则返回true。 最好的解决方案只使用两个数组的单个“线性”传递,利用两个数组已经按排序顺序的事实。

“两个数组的单个'线性'传递”是否意味着在不嵌套第二个循环的情况下解决问题?如果没有,请解释“线性通过”的含义。

否则,如果我对“线性传球”的解释是正确的,我现在不知所措。我能够提出的唯一解决方案包括嵌套在第一个下面的第二个循环。

public static boolean linearIn(int[] outer, int[] inner){
    int trueCount = 0;
    for(int i = 0; i < inner.length; i++){
        for(int x = 0; x < outer.length; x++){
            if(inner[i] == outer[x]){
                trueCount++;
                break;
            }
        }
    }
    return (trueCount == inner.length);
}

5 个答案:

答案 0 :(得分:3)

不要循环内部数组的整个长度...从检查的最后一个值开始,直到你匹配为止。

答案 1 :(得分:1)

在您的实施中,您将循环使用&#34;外部&#34;多次(inner.length次),因此不会对每个数组进行单次传递。

我认为你让自己更加困惑,而不是需要它。可以这样想 - 当你走过一个阵列时,你已经在跟踪你所处的指数(你使用&#34;我&#34;和&#34; x&#34;在您的示例代码中)。为什么不用一个来检查两个阵列?

答案是故意有点模糊,因为这似乎是与家庭作业相关的问题。

答案 2 :(得分:1)

这是单线性通过解决方案。感谢@Paul Becotte和@Andrw。如果这对您有所帮助,请在下面提出他们的答案。

public boolean linearIn(int[] outer, int[] inner) {
  int i = 0;

  if(inner.length == 0) return true;

  for(int o = 0; o < outer.length; o++){
    if(inner[i] == outer[o]) i++;
    if(i == inner.length) return true;
  }
  return false;
}

答案 3 :(得分:0)

这是一个经典的采访问题。最佳答案通常涉及哈希表或映射。 “外部”数组的第一次传递进入哈希表。内部的第二次传递仅检查表中的值是否已经存在。

public static boolean linearIn(int[] outer, int[] inner){

    HashMap<Integer, Boolean> map = new HashMap<Integer, Boolean>();

    for (int o : outer)
    {
        map.put(o, true);
    }

    for (int i : inner)
    {
        Boolean result = map.get(i);
        if ((result == null) || (result.booleanValue() == false))
        {
            return false;
        }
    }

    return true;
}

上面的代码在O(N)中运行。

答案 4 :(得分:0)

我认为这里的答案并不合适,如果没有代码就很难,但我会尝试。

我认为诀窍是迭代更大的数组(外部),但保留一个额外的索引到当前的“内部”(从0开始)

当你经历外部时,如果当前外部的对象小于内部的当前对象,你可以,但还没有到达下一个“内部”,所以继续

如果当前内部的对象与外部的对象相同,那么你很好,你找到了一个匹配......你想增加内部的索引并继续前进。

如果当前外部的对象大于当前内部的对象,那么你错过了一个(外部的一个内部在外部不存在),所以你完成了 - 返回false。

如果你到达循环的末尾然后你完成了所有这些,你知道内在的每一个都在外面。

通过这种方式,它将自动跳过不在内部的“外部”条目。失败的唯一方法是当一个外部大于当前内部时,如果有一个外部与当前内部相同,你将增加内部索引并继续前进。

如果这令人困惑,我很抱歉,因为我说使用代码要容易得多,但我觉得输入学习型问题的代码非常糟糕。