1. 程式人生 > 實用技巧 >劍指 Offer 56 - I. 陣列中數字出現的次數 56 - II. 陣列中數字出現的次數 II

劍指 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;
    }