我有一个数组,其中除了一个重复所有元素:
int[] a={2,6,6,2,4,1,4};
如何找到未配对的元素整数?
答案 0 :(得分:20)
您可以采取一些方法:
i=0
,i=2
等)。如果a[i]
和a[i+1]
不相等 - 或i+1 == a.length
- 您知道a[i]
未配对。a[i]
,迭代元素(在嵌套循环中)并查看a[i] == a[j]
与i != j
之间是否一直发生。如果没有,则a[i]
已取消配对。MIN
和MAX
。创建int[] b = new int[MAX-MIN+1]
。再次迭代元素,为每个元素递增b[a[i]-MIN]
。然后迭代b
;当您找到b[j]==1
时,j
已取消配对。注意:您使用术语“元素整数”,但这不是一个真正的术语。以上假设您的意思是“整数值元素”。如果您实际上是指“element index ”,则只能使用方法2而无需修改。方法3需要进行一些调整,方法1需要进行大量调整。 (当然,一旦你发现值只出现一次,你可以再次遍历数组以找到该值的 index - 如果你仍然有原始的数组顺序。)
编辑添加:我不知道我之前是如何错过的 - 我想我在编写Java时不习惯按位操作 - 但最好的解决方案实际上是:
方法4 - O( n ):计算数组所有元素的按位-XOR ^
。这是不成对的元素。你看,XOR是可交换和关联的,所以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;
计算未配对的元素。 (要获取未配对元素的索引,您需要再次遍历数组,查找result
。)
答案 1 :(得分:1)
您可以使用地图来计算看到一个数字的次数。无疑有更好的方法,但它会起作用。
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" );
}
}
}
答案 2 :(得分:0)
在codility示例中列出了一个示例,我在该示例中进行了测试,发现某些测试用例的正确性也很差