數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)(番外篇)——算法小技巧(持續(xù)更新中...)

1. 交換兩個變量值的三種方法

  1. 申請額外的變量
    int a = 10;
    int b = 20;
    int temp;    //申請額外的變量temp用于交換兩個變量的值
    temp = a;
    a = b;
    b = temp;
    
  2. 使用加減運算
    int a = 10;
    int b = 20;
    a = a + b;   //a = 10 + 20   b = 20
    b = a - b;   //a = 10 + 20   b = 10 + 20 - 20 = 10
    a = a - b;   //a = 10 + 20 - 10   = 20   b = 10
    
  3. 使用異或運算
    int a = 10;
    int b = 20;
    a = a ^ b;   //a = a ^ b b = b
    b = a ^ b;   //a = a ^ b b = a ^ b ^ b = a
    a = a ^ b;   //a = a ^ b ^ a = b b = a
    
    上面異或不太清楚的可以參考我的博客異或的性質(zhì)與應(yīng)用

2. 提取一個數(shù)最右側(cè)的1的方法

  • 先給出方法
    flag = num & (~num + 1);
    
  • 下面來進行分析
    假設(shè)num = 11000110
    ~num = 00111001,
    ~num + 1 = 00111010,
    num & (~num + 1) = 00000010,
    num中最右邊的1保存到了flag中,其他位為0;

3.取中點的方法

  1. 傳統(tǒng)方法

    mid = (L + R) / 2;
    

    這種方法應(yīng)該是我們小學(xué)就學(xué)過的,用第一個數(shù)(也就是最左邊的數(shù))加上最后一個數(shù)(也就是最右邊的數(shù)),再用他們的和除以2,所得到的數(shù)就是中點。這種方法我們再熟悉不過了,但考慮到計算機存儲的限制,如果L和R都是比較大的數(shù),就有可能超出相應(yīng)數(shù)據(jù)類型的存儲范圍,造成溢出。方法二便應(yīng)運而生。

  2. 較好的方法

    mid = L + (R - L) / 2;
    

    使用這種方法,也能很好的求出中點,而且其中運算得到的數(shù)也不會超出數(shù)據(jù)范圍。

  3. 再優(yōu)化
    眾所周知,位運算要快于其他的運算,而除2和乘2都可以看成以為操作,于是最終,求中點的公式為:

    mid = L + ((R - L) >> 1);
    

    本人系菜鳥一枚,所寫文章皆為學(xué)習(xí)總結(jié),大佬請輕噴:??
    謝謝閱讀:??,歡迎補充!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容