题目描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
假·解答一
- 时间复杂度:O(n2)
- 空间复杂度:O(1)
遍历数组,判断当前元素是否是唯一的,是则返回。
if (nums == null || nums.length == 0) return 0;
int i, j;
for (i = 0; i < nums.length; i++) {
for (j = 0; j < nums.length; j++) {
if (i != j && nums[i] == nums[j]) break;
}
if (j == nums.length) return nums[i];
}
return nums[i];
假·解答二
- 时间复杂度:O( nlog(n) + n )
- 空间复杂度:O(1)
先排序,单独的那个元素一定是位于奇数下标处,遍历数组判断当前元素是否等于下一个元素,不相等的话当前元素就是那个单独的元素。
class Solution {
public int singleNumber(int[] nums) {
if (nums == null || nums.length == 0) return 0;
Arrays.sort(nums);
for (int i = 0; i < nums.length - 1; i += 2) {
if (nums[i] != nums[i + 1]) return nums[i];
}
return nums[nums.length - 1];
}
}
真·解答
- 时间复杂度:O(n)
- 空间复杂度:O(1)
采用异或运算
- a ^ a = 0
- a ^ b ^ b = a
- 异或满足交换律和结合律
只要对数组中的所有元素进行一次异或运算,异或后的结果就是答案。
例如nums = [4, 1, 2, 1, 2],4 ^ 1 ^ 2 ^ 1 ^ 2
= 1 ^ 1 ^ 2 ^ 2 ^ 4
=0 ^ 0 ^ 4
= 4
class Solution {
public int singleNumber(int[] nums) {
if (nums == null || nums.length == 0) return 0;
int res = 0;
for (int e : nums) res ^= e;
return res;
}
}