给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
class Solution {
public int singleNumber(int[] nums) {
List<Integer> list = new ArrayList<>();
for (int num : nums) {
if (!list.contains(num)) {
list.add(num);
} else {
list.remove(Integer.valueOf(num));
}
}
return list.get(0);
}
}
复杂度分析:
时间复杂度:O(n²)。
空间复杂度:O(n)。
用 XOR 运算(位运算相同的数 XOR 得到 0,不同的数 XOR 保留其值)使所有成对出现的数字抵消,最终只剩下那个未配对的数字。
class Solution {
public int singleNumber(int[] nums) {
int single = 0;
for (int num : nums) {
single ^= num;
}
return single;
}
}
复杂度分析:
时间复杂度:O(n),其中 n 是数组长度。只需要对数组遍历一次。
空间复杂度:O(1)。