數組中數字出現的次數II


image-20200514213041642

Map記錄數字出現的次數

代碼

   /**
     *  HashMap 集合
     *  23ms
     */
    public int singleNumber(int[] nums) {
        Map<Integer,Integer> map=new HashMap<>();
        for(int num:nums){
            if(map.containsKey(num)){
                map.put(num,map.get(num)+1);
            }else{
                map.put(num,1);
            }
        }
        for(Map.Entry<Integer,Integer> entry:map.entrySet()){
            if(entry.getValue()==1){
                return entry.getKey();
            }
        }
        return 0;
    }

遍歷統計每一位

思路

  • 在數字的二進制形式下,對於出現三次的數字,各二進制位出現的次數都是3的倍數。

  • 統計所有數字的各個二進制中1的出現的次數,對3求余,結果則為只出現一次的數字

    • 詳細思路如下:

      image-20200514213710403

  • 時間復雜度 O(N) :其中 N位數組 nums的長度;遍歷數組占用 O(N) ,每輪中的常數個位運算操作占用 O(1)

  • 空間復雜度 O(1)

  • 修改求余數值m即可解決除了一個數字以外,其他數字都出現m次的通用問題。

代碼

 /*
  * 5ms
  */
   public int singleNumber3(int[] nums) {
       int[] counts=new int[32];
       for(int num:nums){
           for(int j=0;j<32;j++){ //從低位往高位統計
               counts[j]+=num&1;
               num>>>=1;  //無符號右移
           }
       }
       int res=0,m=3;
       for(int i=0;i<32;i++){
           res<<=1; //左移 從高位往低位“累加”
           res|=counts[31-i]%m;  
       }
       return res;
    }

參考 位運算 + 有限狀態自動機,清晰圖解


狀態機

​ 原文鏈接:

狀態機解決此問題詳解 (數字電路)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM