# [136] 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
根据题目,我们很直观的想出:可以利用hash表的方式存储第一次得到的值,之后每次查询hash表看是否有相同的值,若有则删除。遍历结束后hash表中剩下的值即为所求。
这样做时间复杂度O(n),空间复杂度O(n)。
var singleNumber = function(nums) {
const hash = {};
for (let i = 0; i < nums.length; i++) {
if (hash[nums[i]] === undefined) {
hash[nums[i]] = nums[i];
} else {
Reflect.deleteProperty(hash, nums[i]);
}
}
return hash[Reflect.ownKeys(hash)[0]];
};
当然也可以利用排序后的数组相邻的值若不同则可得唯一性来解,这样的时间复杂度O(nlgn),空间复杂度O(1)。这里就不多说了。
但由于题目要求时间复杂度O(n),空间复杂度O(1),因此不能使用排序算法,也不能使用hash-table。
本题使用二进制异或的性质来完成:两个数字异或 a^b 是将 a 和 b 的二进制每一位进行运算,如果同一位的数字相同则为0,不同则为1。
var singleNumber = function(nums) {
let res = 0;
for (let i = 0; i < nums.length; i++) {
res = res ^ nums[i];
}
return res;
};