1. 程式人生 > >leetcode-371-Sum of Two Integers

leetcode-371-Sum of Two Integers

判斷 特殊 而且 tor 完成 很多 bmi else if 優化

題目描述:

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

Example:
Given a = 1 and b = 2, return 3.

要完成的函數:

int getSum(int a, int b)

說明:

1、這道題目其實要實現二進制的加法,我們可以用異或實現,十分簡單。

代碼如下:

    int getSum(int a, int b) 
    {
        int a1,b1,res1,result=0;
        
bool addflag=0; for(int i=0;i<32;i++) { a1=a&1;//取出最低位 b1=b&1;//取出最低位 res1=a1^b1^addflag;//用異或計算加完的結果 if(a1==0&&b1==0)//判斷addflag addflag=0; else if(a1==0&&b1==1&&addflag==0) addflag
=0; else if(a1==0&&b1==1&&addflag==1) addflag=1; else if(a1==1&&b1==0&&addflag==0) addflag=0; else if(a1==1&&b1==0&&addflag==1) addflag=1; else addflag
=1; result+=(res1<<i); a>>=1;//a不斷向右移動一位(二進制) b>>=1;//b不斷向右移動一位(二進制) } return result; }

異或就是二進制的王道運算方法。

上述代碼實測3ms,有很多人實現了2ms的做法,看來還有優化的空間。

2、上述代碼中比較費時間的也就是大堆的if else語句了。

其實我們要判斷的是如下條件:

a1 b1 上個addflag  新的addflag
0 0 0 0
0 0 1 0
0 1 0 0
0 1 1 1
1 0 0 0
1 0 1 1
1 1 0 1
1 1 1 1

有沒有覺得很熟悉,出現了1個1,結果是0,出現了2個1,結果是1。

我們可以用異或來更加快速地處理。

至於全是0和全是1的情況,就特殊處理好了。

代碼如下:

    int getSum(int a, int b) 
    {
        int a1,b1,res1,result=0;
        bool addflag=0;
        for(int i=0;i<32;i++)
        {
            a1=a&1;
            b1=b&1;
            res1=a1^b1^addflag;
            if(a1==1&&b1==1&&addflag==1)
                addflag=1;
            else if(a1==0&&b1==0&&addflag==0)
                addflag=0;
            else
                addflag=!(a1^b1^addflag);
            result+=(res1<<i);
            a>>=1;
            b>>=1;
        }
        return result;
    }

上述代碼實測2ms,beats 100% of cpp submissions。

3、比較1中和2中代碼,為什麽異或做的條件判斷可以比if else語句更省時間?

因為if else語句要不斷嘗試,這個if不滿足,那就再嘗試else if,如果再不滿足,就再嘗試下一個else if,不斷地嘗試過程浪費了一些時間。

而且嘗試過程是a1跟0,b1跟0,addflag跟0這些值在比較,比較過程其實也就是相減,看會不會最終結果為0。所以其實還是在做運算。

異或的做法直接就是三個值做異或運算,一次搞定,所以肯定比if else語句快。

leetcode-371-Sum of Two Integers