美文网首页算法算法学习
数据结构与算法学习(番外篇)——算法小技巧(持续更新中...)

数据结构与算法学习(番外篇)——算法小技巧(持续更新中...)

作者: namedsatan | 来源:发表于2019-11-07 19:21 被阅读0次

    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
      
      上面异或不太清楚的可以参考我的博客异或的性质与应用

    2. 提取一个数最右侧的1的方法

    • 先给出方法
      flag = num & (~num + 1);
      
    • 下面来进行分析
      假设num = 11000110
      ~num = 00111001
      ~num + 1 = 00111010
      num & (~num + 1) = 00000010,
      num中最右边的1保存到了flag中,其他位为0;

    3.取中点的方法

    1. 传统方法

      mid = (L + R) / 2;
      

      这种方法应该是我们小学就学过的,用第一个数(也就是最左边的数)加上最后一个数(也就是最右边的数),再用他们的和除以2,所得到的数就是中点。这种方法我们再熟悉不过了,但考虑到计算机存储的限制,如果L和R都是比较大的数,就有可能超出相应数据类型的存储范围,造成溢出。方法二便应运而生。

    2. 较好的方法

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

      使用这种方法,也能很好的求出中点,而且其中运算得到的数也不会超出数据范围。

    3. 再优化
      众所周知,位运算要快于其他的运算,而除2和乘2都可以看成以为操作,于是最终,求中点的公式为:

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

      本人系菜鸟一枚,所写文章皆为学习总结,大佬请轻喷:😱
      谢谢阅读:😘,欢迎补充!

    相关文章

      网友评论

        本文标题:数据结构与算法学习(番外篇)——算法小技巧(持续更新中...)

        本文链接:https://www.haomeiwen.com/subject/npzvbctx.html