版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
只出现一次的数字 LeetCode136
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
解法一
/**
* 使用一个list保存数字
* 遍历数组,
* 如果list不包含数字,则放入
* 如果list包含数字,则移出
* 遍历结束以后剩余的数就是只出现了一次的数字。
* 时间复杂度O(N)
*/
public int singleNumber(int[] nums) {
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < nums.length; i++) {
if (list.contains(nums[i])) {
list.remove((Integer) nums[i]);
} else {
list.add(nums[i]);
}
}
return list.get(0);
}
解法二
/**
* 位运算 a^a^b = b 时间复杂度O(N)
*/
public int singleNumber1(int[] nums) {
int res = 0;
for (int i : nums) {
res ^= i;
}
return res;
}