LeetCode_数据结构_只出现一次的数字

只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

示例 1:

输入: [2,2,1]
输出: 1
示例 2:

输入: [4,1,2,1,2]
输出: 4

(上述题目来源于LeetCode)

解法一(哈希表)
class Solution {
    public int singleNumber(int[] nums) {
        //将数组中的数据放到哈希表中,通过key找value,如果value等于1,则符合题目要求
        //新建一个hashmap
        Map<Integer,Integer> hashmap = new HashMap<Integer,Integer>();
        //将数组中的元素遍历得到,通过key去找value,如果value为空,说明hashmap中没有,如果有,value++
       for(Integer i : nums){
           Integer count = hashmap.get(i);
           if(count == null){
               hashmap.put(i,1);
           }else{
               count++;
               hashmap.put(i,count);
           }
       }
       //遍历得到所有key,然后通过hashmap.get()得到相应的value,如果value等于1,说明
       //该数字只出现了一次,此时返回该key
       //hashmap.keySet()方法用来返回所有key组成的集合试图
       for(Integer i : hashmap.keySet()){
           Integer count = hashmap.get(i);
           if(count == 1){
               return i;
           }
       }
       //如果都不等于1,返回-1,说明此时hashmap中全是出现两次的数字
       return -1;
    }
}
解法二(双层循环)
class Solution {
    public int singleNumber(int[] nums) {
        //暴力解法,两次循环
        //第一层循环
        for(int i = 0;i < nums.length;i++){
            //设定一个flag,用来判断该数字是否符合题目要求
            boolean flag = true;
            //第二层循环,遍历数组,将数组中每一个数与其他数字进行比较
            //如果有相同数字且下标不同,则不符合要求,flag为false
            for(int j =0;j < nums.length;j++){
                if(nums[i] == nums[j] && i != j){
                    flag = false;
                    break;
                }
            }
            //第二层循环结束后,若没有相同的数字,则这个数符合题目要求
            if(flag == true){
                return nums[i];
            } 
        }
        //全部遍历完后没有找到符合题目的数字,返回-1
        return -1;
    }
}
解法三(运用位运算–异或)
class Solution {
    public int singleNumber(int[] nums) {
        //运用异或运算
        //任何一个数异或0等于任何数
        int num = 0;
        //如果数组长度为奇数,则必定有一个数字是只出现一次的(根据题目要求)
        if(nums.length % 2 != 0){
            for(int i = 0;i < nums.length;i++){
                //^是异或运算符
                //两个相同的数异或等于0,0和任何数异或等于任何数
                //因此数组中所有数进行异或运算,最后得到的数即为只出现一次的数
                num = num ^ nums[i];
            }
        }
        return num;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值