主要思路:
- 通过异或运算,0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),那么我们现在里面只有一个是单独的,其他的都是重复的两个,两个异或就会为0,最终就是0⊕单独数字=单独数字
class Solution {
public int singleNumber(int[] nums) {
int len = nums.length;
int res = 0;
for(int i=0;i<len;i++){
res ^= nums[i];
}
return res;
}
}
- 通过HashSet的不重复性来计算,或者利用HashMap来进行元素和个数的对应
class Solution {
//这个方法主要是通过算出不重复的数字的和m,那么2m=数组总和+x,x就是我们想要的
public int singleNumber(int[] nums) {
int len = nums.length;
if(len==1){
return nums[0];
}
HashSet<Integer> set = new HashSet<>();
for(int i=0;i<len;i++){
if(!set.contains(nums[i])){
set.add(nums[i]);
}
}
int sum = 0;
for(Integer tmp : set){
sum+=tmp;
}
sum = 2*sum;
for(int i=0;i<len;i++){
sum-=nums[i];
}
return sum;
}
}
class Solution {
public int singleNumber(int[] nums) {
int len = nums.length;
HashMap<Integer,Integer> map = new HashMap<>();
for(int i=0;i<len;i++){
if(map.containsKey(nums[i])){
map.put(nums[i],2);
}else{
map.put(nums[i],1);
}
}
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
if(entry.getValue()==1){
return entry.getKey();
}
}
return -1;
}
}
- 先进行排序,排序后的数组,0号元素如果与后面1号不同,那么0号就是单独的数字,如果1号与0和2号不同,那么1号就是单独数字,如果i号与i+1和i-1号不同(1<=i<=len-2),那么i号就是我们想要的,直到最后一个和前一个不同,那么最后一个就是我们想要的。
class Solution {
public int singleNumber(int[] nums) {
int len = nums.length;
if(len==1){
return nums[0];
}
Arrays.sort(nums);
for(int i=0;i<len;i++){
if(i==0 && nums[i]!=nums[i+1]){
return nums[i];
}else if(i==len-1 && nums[i-1]!=nums[i]){
return nums[i];
}else if(i!=0 && i!=len-1 && nums[i]!=nums[i-1] && nums[i]!=nums[i+1]){
return nums[i];
}
}
return -1;
}
}