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

t0ybt7op  于 2023-05-27  发布在  Java
关注(0)|答案(5)|浏览(171)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

9年前关闭。
Improve this question
我正在处理的Java问题如下:
给定两个按升序排序的int数组,outer和inner,如果inner中的所有数字都出现在outer中,则返回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);
}
pbgvytdp

pbgvytdp1#

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

yhuiod9q

yhuiod9q2#

在您的实现中,您将多次循环“outer”(inner.length次),因此不会对每个数组执行一次循环。
我觉得你把事情搞得太复杂了。可以这样想--在遍历一个数组时,您已经在跟踪所处的索引(在示例代码中使用了“i”和“x”)。为什么不用一个来检查两个数组呢?
答案是故意有点模糊,因为它似乎是一个家庭作业相关的问题。

mf98qq94

mf98qq943#

这是单次线性传递解。感谢@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;
}
jslywgbw

jslywgbw4#

这是一个典型的面试问题。最佳答案通常涉及哈希表或Map。第一次遍历“外部”数组进入哈希表。第二次传递inner只是检查该值是否已经在表中。

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)。

g9icjywg

g9icjywg5#

我不认为这里有一个非常有效的答案,没有代码很难做到,但我会尝试。
我认为诀窍是迭代更大的数组(外部),但保留一个额外的索引到当前的“内部”(从开始)
当你经过outer时,如果当前outer中的对象小于当前inner中的对象,你就没事了,只是还没有到达下一个“inner”,所以继续前进
如果当前inner中的对象与outer中的对象相同,那么你很好,你找到了一个匹配...你想增加内部的索引并继续下去。
如果当前外层中的对象大于当前内层中的对象,那么你错过了一个(内层中的一个不存在于外层中),所以你完成了--返回false。
如果你到达了循环的末尾,那么你就通过了所有的循环,你知道每个在内层的都在外层。
通过这种方式,它将自动跳过不在内部的“外部”条目。失败的唯一方法是当一个外部变量大于当前的内部变量时,如果有一个外部变量与当前的内部变量相同,则会增加内部变量的索引并继续前进。
我很抱歉,如果这是混乱的,正如我所说的,这是更容易做的代码,但我觉得真的很糟糕输入代码的学习类型的问题。

相关问题