给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。你可以不使用额外空间来实现吗?
示例1:
输入:[2,2,1]
输出:1
示例2:
输入:[4,1,2,1,4]
输出:1
以上是题目
分析
要求:
- 线性时间复杂度: 要求时间复杂度最高为O(n)
- 不适用额外空间: 要求空间复杂度最高为O(1)
方法一
public classSolution{
public int singleNumber(int[] nums){
//首先将数组排序
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];
}
}
方法二:利用HashSet 中的 remove()方法(如果存在,则从集合中删除指定元素),返回最后单独的数即可。
public class Solution {
public int singleNumber(int[] nums) {
Set<Integer> set = new HashSet<>();
for(int i=0;i<nums.length;i++){
if(!set.add(nums[i]){
set.remove(nums[i]);
}
}
return set.iterator.next();
}
}
方法三: ^ 异或运算 (如果相对应位值相同,则结果为0,否则为1) ※
public class Solution {
public int singleNumber(int[] nums) {
int num=0;
for(int i=0;i<nums.length;i++){
num^=nums[i];
}
return num;
}
}