1. 题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
2. 思路与代码
题目说序列的元素除了一个元素只有一个以外,其余的元素都有两个,我们可以利用这个点进行思考
方法一: 最直接的方法;将数组排序,两个两个元素进行对比,如果相同则跳过,如果不同则返回序列小的元素,如果全部相同则要找的元素在最后一位,返回即可
class Solution {
public int singleNumber(int[] nums) {
Arrays.sort(nums);
for(int i = 1; i < nums.length - 1; i += 2){
if(nums[i - 1] == nums[i]){
continue;
}
else{
return nums[i - 1];
}
}
return nums[nums.length - 1];
}
}
方法二: 位运算 参考leetcode官方解答
//位运算就离谱,谁能想到orz
使用位运算巧妙地利用到了异或的特性
- 任何数和其本身的异或都是0
- 任何数和0异或都是其本身
直到这两个特性这道题就很简单了
将所有数异或,相同的两个数根据特性一异或后就是0,最后只剩下0和不成对的那个数,再根据特性二,答案就出来了
class Solution {
public int singleNumber(int[] nums) {
int singlenum = 0;
for (int i = 0; i < nums.length; i++) {
singlenum ^= nums[i];
}
return singlenum;
}
}