有没有简单的方法来检查两个数组是否包含任何公共元素? 这个合适吗?数组包含char。
类型Arrays.asList(encryptU).contains(Ualpha[randNum]));
提前感谢!
答案 0 :(得分:5)
如果数组很小,那么带有嵌套for循环的解决方案(例如@ scaryrawr's)将表现最佳。
如果阵列足够大,那么上述解决方案的O(N^2)
复杂性将会出现问题。解决方案是使用HashSet; e.g。
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)
临时空间。
如果字符的范围有限,则可以使用BitSet
代替HashSet
。这也将在时间和空间上大致为O(N)
,尽管字符的范围也是复杂性的一个因素,因此将其称为O(N)
过度简化。
但我们可能“过度思考”这一点。最好的建议可能是实现简单的操作,如果怀疑性能是一个真正的问题,那么描述它以避免浪费你的时间进行不必要的优化。 / p>
答案 1 :(得分: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; }
}
只是检查一个中的某个随机位置是否包含在另一个中会给你一些假阴性。
答案 2 :(得分:-1)
试试这个例子
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;
希望这有帮助。