剑指 Offer 56 - I. 数组中数字出现的次数 56 - II. 数组中数字出现的次数 II

 

I. 数组中数字出现的次数 

解法一: 哈希表

public int[] singleNumbers(int[] nums) {
        int[] ans = new int[2];
        Map<Integer,Boolean> map = new HashMap<>();
        for(int i = 0 ; i < nums.length ; i++)
        {
            if(!map.containsKey(nums[i]))
            {
                map.put(nums[i],true);
            }
            else
            {
                map.put(nums[i],false);
            }
        }
        int index = 0 ;
        for(int i = 0 ; i < nums.length ; i++)
        {
            if(map.get(nums[i]))
            {
                ans[index] = nums[i];
                index++;
            }
         }
         return ans;


    }

解法二:利用异或

public int[] singleNumbers(int[] nums) {
        int tmp =  nums[0];
        for(int i = 1 ; i < nums.length ; i++)
        {
            tmp ^= nums[i];
        }
        int divide = lowbit(tmp);
        int ans1 = 0 , ans2 = 0;
        for(int i = 0 ; i < nums.length ; i++)
        {
            if((nums[i]&divide) == 0)
            {
                ans1 ^= nums[i];
            }
            else
            {
                ans2 ^= nums[i];
            }
        }
        int[] ans = new int[]{ans1,ans2};
        return ans;


    }
    public int lowbit(int n)
    {
        return n & (-n);
    }

 

 

II. 数组中数字出现的次数 II

解法一:HashMap

public int singleNumber(int[] nums) {
       Map<Integer,Boolean> map = new HashMap<>();
       for(int i = 0 ; i < nums.length ; i++)
       {
           if(!map.containsKey(nums[i]))
           {
               map.put(nums[i],true);
           }
           else
           {
               map.put(nums[i] , false);
           }
       }
       for(int i = 0 ;  i < nums.length ; i++)
       {
           if(map.get(nums[i]))
           {
               return nums[i];
           }
       }
       return -1;
    }

 

posted @ 2020-07-13 14:34  贼心~不死  阅读(106)  评论(0编辑  收藏  举报