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

简介: [解题报告]《算法零基础100讲》(第16讲) 变量交换算法

零、写在前面


        这是打卡的第十六天,今天题目比较简单,我们直接上结果,主要知识点在


《算法零基础100讲》(第16讲) 变量交换算法https://blog.csdn.net/WhereIsHeroFrom/article/details/121155355

https://blog.csdn.net/WhereIsHeroFrom/article/details/121155355


一、主要知识点


       1.加法变量交换


       主要利用到的思想就是a + b - b = a; a + b - a = b;

void swap(int *a, int *b){ 
    *a = *a + *b;          
    *b = *a - *b;          
    *a = *a - *b;          
}


       2.位运算实现变量交换(补充知识点)


       计算机内有一个神奇的操作叫做异或(^),这个是底层硬件实现的,对应的真值表为


屏幕快照 2022-04-12 下午12.27.54.png

       看出来什么规律了么?其实就几个字 同1 异0


       这个有个好处是 这个是位运算,不会产生加法那样的溢出。同时有a^b^a = b;a^b^b = a;(可以对这四种输入进行验证)


void jiaohuan(int *a, int *b){
    *a = *a ^ *b; //a赋值为a^b
    *b = *a ^ *b; //b赋值为a^b^b == a
    *a = *a ^ *b;//a赋值为a^b^a == b
}

三条语句后面完全一样,但是结果不同,神奇不?


二、课后习题


面试题 16.01. 交换数字


面试题 16.01. 交换数字https://leetcode-cn.com/problems/swap-numbers-lcci/

https://leetcode-cn.com/problems/swap-numbers-lcci/

交换连个数字。没啥难度。。


主要思想


运用位运算直接交换就行了。

int* swapNumbers(int* numbers, int numbersSize, int* returnSize){
    *returnSize = numbersSize;            //返回数组大小为2
    numbers[0] = numbers[0] ^ numbers[1];// a = a^b
    numbers[1] = numbers[0] ^ numbers[1];//b = a^b^b = a
    numbers[0] = numbers[0] ^ numbers[1];//a = a^b^a = b
    return numbers;
}


结果分析


image.png


还是可以的。满意了,下一个


面试题 05.07. 配对交换


面试题 05.07. 配对交换https://leetcode-cn.com/problems/exchange-lcci/

https://leetcode-cn.com/problems/exchange-lcci/


       将一个数字的奇数位和偶数位进行交换


主要思想


  用ans吸收奇数位和偶数位,每次右移两位,迭代求解。

int exchangeBits(int num){
    int ans = 0,i = 0;
    while(num){
        ans += (num & 1) << 2*i+1;    //偶数位左移2i+1位
        ans += (num >> 1 & 1)  << 2*i;//奇数位左移2i位完成交换
        num >>= 2;                    //每次右移两位
        i++;
    }
    return ans;
}

结果分析


image.png


凑合凑合。


思路2


直接根据位运算取出来奇数位左移,偶数位右移一位相加得到结果。

int exchangeBits(int num){
    return ((num & 0x55555555) << 1) + ((num & 0xAAAAAAAA) >> 1);
}


三、今日总结


今天的难度不高,但是位运算还是很有意思的0.0


相关文章
|
2天前
|
算法
【优选算法专栏】专题九:链表--------两两交换链表中的节点
【优选算法专栏】专题九:链表--------两两交换链表中的节点
18 0
|
2天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-246 算法训练 猴子吃包子
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-246 算法训练 猴子吃包子
37 2
|
2天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-48 算法训练 关联矩阵
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-48 算法训练 关联矩阵
38 0
|
2天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-42 算法训练 送分啦
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-42 算法训练 送分啦
38 0
|
2天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-8 算法训练 操作格子 线段树
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-8 算法训练 操作格子 线段树
29 0
|
2天前
|
算法 Java Serverless
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
34 1
|
2天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
41 1
|
2天前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-7 算法训练 逆序对 平衡二叉树
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-7 算法训练 逆序对 平衡二叉树
36 0
|
2天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-49 算法训练 寻找数组中最大值
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-49 算法训练 寻找数组中最大值
37 0
|
1天前
|
算法 安全
死锁相关知识点以及银行家算法(解题详细步骤)
死锁相关知识点以及银行家算法(解题详细步骤)
6 2