题意
给出一个整数数组,除了一个元素只出现一次,数组中的每个元素出现了两次,找出该元素
PS:线性的时间复杂度,能否不用额外空间完成?
题解
建立一个HashMap,键是整数元素,值是元素出现的次数。对数组进行HashMap的建立,然后遍历HashMap,找出value为1的元素,返回Map的key键
遍历过程参考 Java中HashMap遍历的两种方式
Map map = new HashMap();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
}
public class Solution {
public int singleNumber(int[] nums) {
//key是整数 value是该整数出现的次数
Map<Integer,Integer> numsMap = new HashMap<Integer,Integer>();
int res = 0;
for(int i = 0;i < nums.length;i ++)
{
//if(numsMap.containsKey(num[i] == false)
//Map中没有元素,就放入该元素
if(numsMap.get(nums[i]) == null)
numsMap.put(nums[i],1);
else
{
//有该元素,将元素的value+1更新HashMap
numsMap.put(nums[i],numsMap.get(nums[i]) + 1);
}
}
//遍历HashMap,找出value = 1的值
Iterator iter = numsMap.entrySet().iterator();
while(iter.hasNext())
{
//Entry对象
Map.Entry entry = (Map.Entry) iter.next();
//Object key = entry.getKey();
//Object val = entry.getValue();
//Object转int
if(Integer.parseInt(String.valueOf(entry.getValue())) == 1)
res = Integer.parseInt(String.valueOf(entry.getKey()));
}
/*
Set set = numsMap.keySet();
//iter迭代器
Iterator iter = set.iterator();
while(iter.hasNext())
{
//String str = (String)iter.next();
String str = "" + iter.next();
if(Integer.valueOf(str) == 1)
res = Integer.valueOf(str);
}
*/
return res;
}
}
当然,由于又是找不同的一个数字,用Solutions提到的位运算同样简单:
we use bitwise XOR to solve this problem :
first , we have to know the bitwise XOR in java
0 ^ N = N
N ^ N = 0
So….. if N is the single number
N1 ^ N1 ^ N2 ^ N2 ^…………..^ Nx ^ Nx ^ N
= (N1^N1) ^ (N2^N2) ^…………..^ (Nx^Nx) ^ N
= 0 ^ 0 ^ ……….^ 0 ^ N
= N
public int singleNumber(int[] nums) {
int result = 0;
for(int i : nums) {
result ^= i;
}
return result;
}