栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

[C语言题解]《算法零基础100讲》(第16讲) 变量交换算法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[C语言题解]《算法零基础100讲》(第16讲) 变量交换算法

变量交换算法
  • 概念定义
  • 课后练习
    • 面试题 05.07. 配对交换

概念定义

  交换变量,就是把两个数据的变量进行一次交换。如:a = 1,b = 2,交换后a = 2,b = 1。
对于交换的方法,可以看一下这篇博客变量交换

课后练习 面试题 05.07. 配对交换


这道题较笨的思路就是先将其转化为二进制,然后进行奇偶位的交换,再将交换后的二进制数转化为十进制。
代码如下:

int Mypower(int x, int n){
    if(n == 0){
        return 1;
    }
    int v = Mypower(x, n / 2);
    return n % 2 == 0 ? v * v : x * v * v;
}

int exchangeBits(int num){
    int BinarySystem[32];
    int len = 0;
    //转换二进制
    while(num){
        int k = num % 2;
        num /= 2;
        BinarySystem[len++] = k;
    }
    if(len % 2){
        BinarySystem[len] = 0;
    }
    //交换奇偶位
    for(int i = 1; i <= len; i += 2){
        if(len % 2 == 0 && i == len){
            break;
        }
        int temp = BinarySystem[i];
        BinarySystem[i] = BinarySystem[i - 1];
        BinarySystem[i - 1] = temp;
    }
    int ret = 0;
    //转换十进制
    for(int i = 0; i <= len; i++){
        if(len % 2 == 0 && i == len){
            break;
        }
        ret += BinarySystem[i] * Mypower(2, i);
    }
    return ret;
}

另外一种算法的代码就十分简便,几行就能搞定,他是通过位运算进行的。
再此之前,我们需先知道两个比较特别的二进制数0xaaaaaaaa和0x55555555 。

0xaaaaaaaa = 10101010101010101010101010101010(奇数位为0,偶数位为1)
0x55555555 = 1010101010101010101010101010101 (奇数位为1,偶数为为0)

然后我们分别将num与0xaaaaaaaa和0x55555555进行按位与(&)计算,然后再分别进行<<1和>>1计算即可。
用这种方法做这道题前可以先看看190. 颠倒二进制位

代码如下:

#define EVEN_BIT_MASK 0x55555555
#define ODD_BIT_MASK 0xaaaaaaaa 

int exchangeBits(int num){
    return ((num & ODD_BIT_MASK) >> 1) | ((num & EVEN_BIT_MASK) << 1);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/429509.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号