leetcode刷題——一些算法技巧總結2.0


  1. 異或、與的一點總結(這些位運算真的是騷操作2333)

    • 兩個相同的數字:a^a=0

    • 取出一個數最右端為1的那一位:a &=-a

      其中-a是在計算機中就是a的補碼表示(這樣所有的加法運算可以使用同一種電路完成),因為補碼等於原碼的反碼+1,所以a&-a就是a最右邊一位為1,其他位為0的數

      另外:~a = -a-1

      	已知負數的補碼,求其原碼:左右找1,此兩1不變,中間取反。
      
    • x&x-1 ==0

      -判斷 是否是2的n次方。

      -把一個整數減去1,再和原整數做與運算,會把該整數最右邊一個1變成0.那么一個整數的二進制有多少個1,就可以進行多少次這樣的操作。

    • x&1 最低位二進制數,可以用來判斷奇偶

    • 一個數字除以2 x>>1效率更高

  2. 利用邏輯與&&的短路原理,可以實現類似if判斷的功能。

    例如:實現1+2+3+……+n

    //1.需利用邏輯與的短路特性實現遞歸終止。 2.當n==0時,(n>0)&&((sum+=Sum_Solution(n-1))>0)只執行前面的判斷,為false,然后直接返回0;
    //3.當n>0時,執行sum+=Sum_Solution(n-1),實現遞歸計算Sum_Solution(n)。
        public int Sum_Solution(int n) {
            int sum = n;
            boolean ans = (n>0)&&((sum+=Sum_Solution(n-1))>0);
            return sum;
        }
    
  3. 利用&^實現加法

       public int Add(int num1,int num2) {
            while(num2!=0){
                int tmp=num1^num2;
                num2=(num1&num2)<<1;//進位
                num1=tmp;
            }
            return num1;
        }
    


免責聲明!

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



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