[解题报告]《算法零基础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


相关文章
|
4月前
|
算法 安全 Java
介绍一下比较与交换算法
【10月更文挑战第20天】介绍一下比较与交换算法
31 0
|
4月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
168 0
|
4月前
|
算法 C++
【算法解题思想】动态规划+深度优先搜索(C/C++)
【算法解题思想】动态规划+深度优先搜索(C/C++)
|
8月前
|
机器学习/深度学习 存储 算法
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
|
8月前
|
算法 C语言
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)二
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)二
52 2
|
8月前
|
搜索推荐 算法 Java
JAVA中的交换类排序算法详解
JAVA中的交换类排序算法详解
68 1
|
9月前
|
算法 安全
死锁相关知识点以及银行家算法(解题详细步骤)
死锁相关知识点以及银行家算法(解题详细步骤)
388 2
|
8月前
|
存储 机器学习/深度学习 算法
python 3种算法 回溯法、字典序生成、递归交换 实现全排列【力扣46题】
python 3种算法 回溯法、字典序生成、递归交换 实现全排列【力扣46题】
|
8月前
|
算法 C语言
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)一
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)一
51 0
|
9月前
|
网络协议 算法 数据库
【专栏】IS-IS协议是内部网关协议,常用于大型网络路由器间的路由信息交换,基于OSI的CLNP标准和Dijkstra算法
【4月更文挑战第28天】IS-IS协议是内部网关协议,常用于大型网络路由器间的路由信息交换,基于OSI的CLNP标准和Dijkstra算法。其特点是分层设计、快速收敛、高效资源利用和强故障恢复能力。在现代网络中,IS-IS广泛应用于服务提供商、企业网络及与其他协议的融合,是构建稳定、高效网络的关键。了解和应用IS-IS能提升网络系统的可靠性和效率。
177 0

热门文章

最新文章