只出现一次的数字

主要思路:

  1. 通过异或运算,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;
    }
}
  1. 通过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;
    }
}
  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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值