我想检查数组B是否是数组A的排列。
我认为可以使用1 for
- 循环完成,但我看到不同的来源,大多数人告诉我使用2 for
- 循环。
for (int i = 0; i < A.length; i++) {
boolean found = false;
for (int j = 0; j < B.length; j++)
if (B[j] == A[i]) {
found = true;
break;
}
assert(found);
}
for (int i = 0; i < B.length; i++) {
boolean found = false;
for (int j = 0; j < A.length; j++)
if (A[j] == B[i]) {
found = true;
break;
}
assert(found);
}
这是一个正确的实现2 for
- 循环吗?
顺便说一句,为什么我必须执行2 for
- 循环,其中第一个是比较B和A,然后是第二个A和B?
答案 0 :(得分:2)
您的代码将排列检查分为两个操作:
A[i]
检查A[i]
B
B[j]
检查B[j]
A
醇>
如@Tom所述,这在一般情况下不起作用,因为它忽略了重复的元素。
效率也很低。如果在其他任何事情之前检查A.length == B.length
,则第二部分可以省略,但其余部分仍为O(n²)
。它仍然是错误的,因为它在考虑重复元素时会返回误报。
- 更多或更少 - 规范方法是简单地对两个数组进行排序并将它们进行相等性比较:
Arrays.sort(A);
Arrays.sort(B);
assert(Arrays.equals(A, B));
排序通常知道为O(n ln n)
,因此整个操作现在比以前更有效。它还使事情更具可读性。