《算法零基础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) (108a,b108)

三、算法详解

  首先,实现函数交换变量的值,我们可以利用指针将值传入;
  然后,可以利用 加法 和 减法 实现变量交换,具体实现如下代码所示。

四、源码剖析

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 的值;

五、推荐专栏

🧡《C语言入门100例》🧡

给定 a 和 b ,交换它们的值并输出 | 四种解法

六、习题练习

序号题目链接难度
1交换数字★☆☆☆☆
2 配对交换★☆☆☆☆
👇🏻 关注公众号 观看 精彩学习视频👇🏻

以上是关于《算法零基础100讲》(第16讲) 变量交换算法的主要内容,如果未能解决你的问题,请参考以下文章

《算法零基础100讲》(第46讲) 位运算 (异或) 入门

《算法零基础100讲》(第26讲) 字符串算法 - 回文串

《算法零基础100讲》(第3讲) 矩阵

《算法零基础100讲》(第25讲) 字符串算法 - 字符串反转

《算法零基础100讲》(第24讲) 字符串算法 - 字符计数法

《算法零基础100讲》(第17讲) 线性枚举 - 最值算法