题目
大致思路
方法一:先排序,然后2个2个进行遍历,因为排序之后这个单独的数字一定在偶数下标对应的位置,找到不相同的这两个相邻数字,这两个数字中位于偶数下标的即为那个单独的数字,如果遍历结束还没找到,则为最后一个数字,注意遍历的时候只遍历到长度-1处即可。
方法二:利用set集的特性,来进行实现,出现重复的就删除出set,对对碰的思想,直到遍历完,set中剩余的那一个就是单独的那个数字。
方法三:差值法,排序后,单独的那个数字一定在偶数下标处,将所有偶数下标数字加起来减去所有奇数下标数字的和即为所求值。
方法四:异或法,该题的最佳解法:同的数字异或为0,0与任何数字异或,结果为该数字,即为那个但难度的数字
代码实现
class Solution {
public int singleNumber(int[] nums) {
/*遍历法,先排序,再遍历 10ms
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];
*/
/* 方法二:利用set集的特性,来进行实现,出现重复的就删除出set,对对碰的思想,直到遍历完,set中剩余的那一个就是 单独的那个数字 20ms
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();
*/
/*方法三:差值法:排序后,单独的那个数字一定在偶数下标处,将所有偶数下标数字加起来减去所有奇数下标数字的和,
//即为所求的值。 10ms
Arrays.sort(nums);
int count = 0;
for(int i = 0;i<nums.length;i++){
count = i % 2 == 0 ? count+nums[i] : count-nums[i];
}
return count;
*/
//*方法四:异或法,相同的数字异或为0,0与任何数字异或,结果为该数字,1ms,异或法应该为最佳解法。
int result = 0;
for(int i = 0;i<nums.length;i++){
result = result ^ nums[i];
}
return result;
}
}