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

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);
    

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

你可能感兴趣的:(数据结构与算法学习(番外篇)——算法小技巧(持续更新中...))