我正在研究的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);
}
答案 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。
如果你到达循环的末尾然后你完成了所有这些,你知道内在的每一个都在外面。
通过这种方式,它将自动跳过不在内部的“外部”条目。失败的唯一方法是当一个外部大于当前内部时,如果有一个外部与当前内部相同,你将增加内部索引并继续前进。
如果这令人困惑,我很抱歉,因为我说使用代码要容易得多,但我觉得输入学习型问题的代码非常糟糕。