Java 在数组中查找未配对的数字
我有一个数组,其中除一个元素外,所有元素都重复:Java 在数组中查找未配对的数字,java,arrays,Java,Arrays,我有一个数组,其中除一个元素外,所有元素都重复: int[] a={2,6,6,2,4,1,4}; 如何找到未配对的元素整数?您可以使用映射来记录一个数字出现的次数。毫无疑问,有更好的方法可以做到这一点,但它会奏效的 public static void main( String[] args ) { int[] a = { 2, 6, 6, 2, 4, 1, 4 }; Map<String, Integer> counts = new HashMap<St
int[] a={2,6,6,2,4,1,4};
如何找到未配对的元素整数?您可以使用映射来记录一个数字出现的次数。毫无疑问,有更好的方法可以做到这一点,但它会奏效的
public static void main( String[] args ) {
int[] a = { 2, 6, 6, 2, 4, 1, 4 };
Map<String, Integer> counts = new HashMap<String,Integer>();
String key;
for ( int i : a ) {
key = String.valueOf( i );
if ( counts.containsKey( key ) ) {
int count = counts.get( key );
counts.put( key, ++count );
}
else {
counts.put( key, 1 );
}
}
for ( Map.Entry<String, Integer> entry : counts.entrySet() ) {
if ( entry.getValue() < 2 ) {
System.out.println( entry.getKey() + " does not have a pair" );
}
}
}
publicstaticvoidmain(字符串[]args){
int[]a={2,6,6,2,4,1,4};
映射计数=新的HashMap();
字符串键;
对于(int i:a){
key=String.valueOf(i);
if(计数容器(键)){
int count=counts.get(键);
计数。输入(键,++计数);
}
否则{
计数。放置(键,1);
}
}
for(Map.Entry:counts.entrySet()){
if(entry.getValue()<2){
System.out.println(entry.getKey()+“没有对”);
}
}
}
您可以采取以下几种方法:
- 方法1-O(n日志n):对数组排序。然后,迭代排序数组的元素,每次迭代两个(
,i=0
,等等)。当i=2
和a[i]
不相等时,或者当a[i+1]
时,您知道i+1==a.length
是不成对的a[i]
- 方法2-O(n2):迭代元素。对于每个元素
,迭代元素(在嵌套循环中),查看a[i]
在a[i]==a[j]
。如果不是,则i!=j
是不成对的a[i]
- 方法3-O(m),其中m是最大和最小元素之间的差值(注意m是Ω(n)):迭代元素,找到最大和最小值
和MIN
。创建一个MAX
。再次迭代元素,为每个元素增加int[]b=newint[MAX-MIN+1]
。然后迭代b[a[i]-MIN]
;当您找到b
时,b[j]==1
是不成对的j
编辑后添加:我不知道以前怎么会错过这一点-我想我不习惯在编写Java时考虑按位操作-但最好的解决方案实际上是:
- 方法4-O(n):计算数组所有元素的按位异或,
。这是未配对的元素。你看,异或是交换的和结合的,所以^
与2^6^6^2^4^1^4
是一样的;而且1^(2^2)^(4^4)^(6^6)
始终是x^x
,因此这两个对总是相互抵消。你可以写:0
计算未配对的元素。(要获得未配对元素的索引,您需要再次迭代数组,查找int result = 0; for(int i : a) result ^= i;
)结果
int
作为字符串
,只需要做一个映射
,就可以了=)对于第一种方法,你可能还需要O(N)
空间,这取决于排序算法。有人能分享一个我可以学习如何计算复杂性的源代码吗?我的意思是O(n),O(logn)。我不知道他们是什么意思。编辑:有一个-->