《算法零基础100讲》(第16讲) 变量交换算法
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《算法零基础100讲》(第16讲) 变量交换算法相关的知识,希望对你有一定的参考价值。
零、写在前面
这是《算法零基础100讲》 专栏打卡学习的第十六天了。
经过前面几章的数学思维训练以后,相信留下来的都是精英了,其实每天打卡的题,做不出来没关系,因为困难的题涉及知识点较多,后面还是会开放出来的,所以不要着急,内容能看懂,能自己分析,能做出简单题,就可以打卡。
在刷题的过程中,总结自己遇到的坑点,写出 「 解题报告 」 供他人学习,也是一种自我学习的方式。这就是经典的帮助他人的同时,成就自己。目前, 「 万人千题 」 社区 每天都会有五六篇高质量的 「 解题报告 」 被我 「 加精 」。如果觉得自己有能力的,也可以来发布你的 「 解题报告 」。千万级流量,你我共同拥有。
今天介绍一下如何交换两个变量的值,这个是一个非常经典的思想,也是后面在各种算法运用中经常会出现的一种简单的手法。
一、概念定义
在 python 中,我们可以直接写出下面这样的代码就实现了变量的交换。
a, b = b, a
在C语言里,这个语法是错误的。
我们可以这么理解,你有两个杯子
a
a
a 和
b
b
b,两个杯子里都盛满了水,现在想把两个杯子里的水交换一下,那么第一个想到的方法是什么?当然是再找来一个临时杯子:
1)先把
a
a
a 杯子的水倒进这个临时的杯子里;
2)再把
b
b
b 杯子的水倒进
a
a
a 杯子里;
3)最后把临时杯子里的水倒进
b
b
b 杯子;
这种就是临时变量法。当然,还有 加减法、异或法 等其它方法。
二、题目描述
编写一个函数,不用临时变量,直接交换 a a a 与 b b b 的值 ( − 1 0 8 ≤ a , b ≤ 1 0 8 ) (-10^8 \\le a,b \\le 10^8) (−108≤a,b≤108)。
三、算法详解
首先,实现函数交换变量的值,我们可以利用指针将值传入;
然后,可以利用 加法 和 减法 实现变量交换,具体实现如下代码所示。
四、源码剖析
void swap(int *a, int *b){ // (1)
*a = *a + *b; // (2)
*b = *a - *b; // (3)
*a = *a - *b; // (4)
}
- ( 1 ) (1) (1) 利用指针将值传入;
- ( 2 ) (2) (2) a a a 和 b b b 解引用以后将 a + b a+b a+b 赋值给 a a a;
- ( 3 ) (3) (3) 这时候的 a a a 已经是 a + b a+b a+b 了,所以再减去 b b b,这样就把 a a a 的值赋值给了 b b b;
- ( 4 ) (4) (4) 这时候的 a a a 还是 a + b a+b a+b,再减去 a a a,值为 b b b 并且赋值给了 a a a,从而交换了 a a a 和 b b b 的值;
五、推荐专栏
六、习题练习
序号 | 题目链接 | 难度 |
---|---|---|
1 | 交换数字 | ★☆☆☆☆ |
2 | 配对交换 | ★☆☆☆☆ |
以上是关于《算法零基础100讲》(第16讲) 变量交换算法的主要内容,如果未能解决你的问题,请参考以下文章
《算法零基础100讲》(第25讲) 字符串算法 - 字符串反转