1

有没有简单的方法来检查两个数组是否包含任何公共元素?这合适吗?数组包含 char 类型。

Arrays.asList(encryptU).contains(Ualpha[randNum]));

提前致谢!

4

3 回答 3

6

如果数组很小,那么具有嵌套 for 循环(例如 @scaryrawr's)的解决方案将表现最佳。

如果数组足够大,那么O(N^2)上述解决方案的复杂性就会有问题。解决方案是使用 HashSet;例如

HashSet<Character> tmp = new HashSet<Character>();
for (char ch : arr1) {
    tmp.add(ch);
}
for (char ch : arr2) {
    if (tmp.contains(ch)) {
        // elements in common!!
    }
}

这是O(N)及时的,尽管比例常数相当大。(我认为您需要数组大小的乘积为 20 或 30 才能比嵌套循环解决方案更快……但这是一个猜测。)此外,这需要O(N)临时空间。


如果字符的范围有限,那么您可以使用 aBitSet而不是 a HashSet。这也将大致O(N)在时间和空间上,尽管字符的范围也是复杂性的一个因素,因此称其O(N)为过度简化。


But we are probably "over-thinking" this. The best advice would probably be to implement something simple, and if there is a suspicion that performance is a real concern then profile it to avoid wasting your time with unnecessary optimizing.

于 2012-10-07T01:46:16.947 回答
0

任何常见元素:

char[] a = {...};
char[] b = {...};
boolean hasCommon = false;
for (char alpha : a) {
    for (char beta : b) {
        if (alpha == beta) {
            hasCommon = true;
            break;
        }
    }
    if (hasCommon) { break; }
}

只是检查一个中的某个随机位置是否包含在另一个中会给你一些假阴性。

于 2012-10-07T01:18:30.997 回答
0

试试这个例子

Character[] arr1 = {'a', 'b', 'c', 'd', 'e'}
Character[] arr2 = {'a', 'b', 'c', 'd', 'e'}

boolean matches = arr.toString().equals(arr2.toString());

这将检查两个数组是否完全相等。

如果你想看看它们是否有共同点,

List<Character> chars = Arrays.asList(arr1);
List<Character> chars2 = Arrays.asList(arr2);

boolean matches = (chars.retainAll(chars2).size()==0)?false:true;

希望这可以帮助。

于 2012-10-07T01:23:54.877 回答