题目:只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
答案:
1.列表操作
如果列表中包含了该数字,则删除,不包含则加入,最后列表中只剩下一个数字即为所求数字
class Solution {
public int singleNumber(int[] nums) {
List<Integer> list = new LinkedList<>();
for (int num : nums) {
if (!list.contains(num)) {
list.add(num);
} else {
list.remove((Object)num);
}
}
return list.get(0);
}
}
时间复杂度:O(n)
空间复杂度:O(n)
2.哈希表
class Solution {
public int singleNumber(int[] nums) {
Map<Integer, Object> map = new HashMap<>();
for (int num : nums) {
if (!map.containsKey(num)) {
map.put(num, null);
} else {
map.remove(num);
}
}
return map.keySet().iterator().next();
}
}
时间复杂度:O(n)
空间复杂度:O(n)
3.数学
2∗(a+b+c)−(a+a+b+b+c)=c
class Solution {
public int singleNumber(int[] nums) {
int sum = 0;
int setSum = 0;
Set<Integer> set = new HashSet<>();
for (int num : nums) {
sum += num;
set.add(num);
}
// 使用迭代器遍历set集合
Iterator<Integer> it = set.iterator();
while (it.hasNext()) {
Integer n = it.next();
setSum += n;
}
return 2 * setSum - sum;
}
}
时间复杂度:O(n)
空间复杂度:O(n)
4.位操作
概念
如果我们对 0 和二进制位做 XOR 运算,得到的仍然是这个二进制位
a⊕0=a
如果我们对相同的二进制位做 XOR 运算,返回的结果是 0
a⊕a=0
XOR 满足交换律和结合律
a⊕b⊕a=(a⊕a)⊕b=0⊕b=b
所以我们只需要将所有的数进行 XOR 操作(按位异或),得到那个唯一的数字。
class Solution {
public int singleNumber(int[] nums) {
int result = 0;
for (int num : nums) {
result ^= num;
}
return result;
}
}
时间复杂度:O(n)
空间复杂度:O(1)