很多程序经常使用的最普通,比较常见的,也是比较简单的一个算法

1、普通方法,借助一个额外内存变量实现交换:

#include <iostream>
using namespace std;int main(int argc, const char * argv[]) {int a;int b;int temp;a = 100;b = 200;cout << "a = " << a << " b = " << b << endl;//swap 交换temp = a;a = b;b = temp;cout << "a = " << a << " b = " << b << endl;return 0;
}

老掉牙的套路

2、额外内存方法,做成函数

#include <iostream>
using namespace std;void swap(int, int);int main(int argc, const char * argv[]) {int a;int b;a = 100;b = 200;cout << "a = " << a << " b = " << b << endl;swap(a, b);cout << "a = " << a << " b = " << b << endl;return 0;
}void swap(int a, int b)
{int temp;//swap 交换temp = a;a = b;b = temp;
}

a = 100 b = 200

a = 100 b = 200

Program ended with exit code: 0

没有发生改变,不起作用,还是老生常谈了。因为传递的是参数的拷贝,交换的是拷贝,对原来的数,没有任何影响。改正:

#include <iostream>
using namespace std;void swap(int *, int *);int main(int argc, const char * argv[]) {int a;int b;a = 100;b = 200;cout << "a = " << a << " b = " << b << endl;swap(&a, &b);cout << "a = " << a << " b = " << b << endl;return 0;
}void swap(int *a, int *b)
{int temp;//swap 交换temp = *a;*a = *b;*b = temp;
}

a = 100 b = 200

a = 200 b = 100

Program ended with exit code: 0

3、使用 c 语言里的宏定义(宏函数)

复习笔记回忆:#define的用法

#include <iostream>
using namespace std;
#define SWAP(x, y, z) ((z) = (x), (x) = (y), (y) = (z))int main(int argc, const char * argv[]) {int a;int b;int c;a = 10;b = 200;cout << "a = " << a << " b = " << b << endl;SWAP(a, b, c);cout << "a = " << a << " b = " << b << endl;return 0;
}

a = 10 b = 200

a = 200 b = 10

Program ended with exit code: 0

4、使用 c++独有的引用

#include <iostream>
using namespace std;void swap(int &, int &);int main(int argc, const char * argv[]) {int a;int b;a = 100;b = 200;cout << "a = " << a << " b = " << b << endl;swap(a, b);cout << "a = " << a << " b = " << b << endl;return 0;
}void swap(int &a, int &b)
{int temp;//swap 交换temp = a;a = b;b = temp;
}

不使用额外内存的方法,数学方法

不开辟新的内存变量实现交换(阿里巴巴的面试题,有时候为了追求机器的高性能,高效率,节约内存,一般用这种算术技巧,加减法可以,乘除法也可以,使用位操作也可以)

5、算术运算方法

#include <iostream>
using namespace std;int main(void)
{int a = 100;int b = 200;cout << "a = " << a << " b = " << b << endl;a = a + b;//把 a,b 的和给 a,此时的 a 是a+b 的和b = a - b;//等价于把 a 赋值给 b,此时的 b 是 a 的值a = a - b;//等价于把 b 赋值给 a,完成了交换
    cout << "a = " << a << " b = " << b << endl;return 0;
}

a = 100 b = 200

a = 200 b = 100

Program ended with exit code: 0

同样乘除也可以实现,其实就是小学生的算术,只是想不到而已。

    a = a * b;b = a / b;a = a / b;

6、位运算方法

相关复习c 语言的位运算符复习

异或运算有这样一个性质:

a ^ b ^ a;

也就是 x 异或 y 再异或 x,最后的结果是 y(中间的变量被提出)

例如:a=3,即11(2);b=4,即100(2)。
想将a和b的值互换,可以用以下赋值语句实现:
    a=a∧b;
    b=b∧a;//相当于b = b ^ a ^ b;最后把 a 提出,给了 b
    a=a∧b;//相当于,a = a ^ b ^ a;,最后把 b 提出,给了a

a=011(2)(∧)b=100(2)
a=111(2)(a∧b的结果,a已变成7)(∧)b=100(2)
b=011(2)(b∧a的结果,b已变成3)(∧)a=111(2)

a=100(2)(a∧b的结果,a已变成4)

等效于以下两步:
    ① 执行前两个赋值语句:“a=a∧b;”和“b=b∧a;”相当于b=b∧(a∧b)。
    ② 再执行第三个赋值语句: a=a∧b。由于a的值等于(a∧b),b的值等于(b∧a∧b),

因此,相当于a=a∧b∧b∧a∧b,即a的值等于a∧a∧b∧b∧b,等于b。不推荐这样写,也不推荐在项目中使用!

C 语言的一条语句中,最好是,一个变量的值只允许改变一次,像x = x++ 这种代码都是未定义行为。在C语言里没有哪条规则保证以上写法是永远正确的。
另外,用异或交换变量既不会加快运行速度(反而更慢,六读三写加三次异或),也不会节省空间(中间变量tmp 通常会用寄存器,而不是内存空间存储)。

这个技巧的意义完全在于应付变态的面试,知道就行了,绝对不要放在产品代码中。所以说这只是“面试技巧”。

补充其他性质:

1、交换律

2、结合律(即(a^b)^c == a^(b^c))

3、对于任何数x,都有x^x=0,x^0=x

4、自反性 A XOR B XOR B = A xor  0 = A

一道面试题:用多种方法实现两个数的交换相关推荐

  1. 用指针和函数的方法完成两个数的交换

    <程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p142 7.1.2 上级实训内容 [实训内容6]用指针和函数的方法完成两个数的交换 传递规则:主函数 ...

  2. c++ std 方法 取两个数的较大_【数据结构C++】两数交换(4种方法)

    一.语言:C++ 二.内容:通过函数调用实现两个数的交换 三.方法: 正常函数交换 引用类型的函数交换 指针类型的函数交换 宏函数定义交换(不常见) #include <iostream> ...

  3. 创建方法求两个数的最大值max2,随后再写一个求3个数的最大值的函数max3。​ 要求:在max3这个函数中,调用max2函数,来实现3个数的最大值计算

    //创建方法求两个数的最大值max2,随后再写一个求3个数的最大值的函数max3.//要求:在max3这个函数中,调用max2函数,来实现3个数的最大值计算public static int max3 ...

  4. 【C/C++】异或操作巧妙实现两个数的交换操作

    今天在看OpenGL加载TGA格式图像用作纹理的代码时,看到关于RGB(A)顺序转换的一行代码时,捉一开始感到很困惑,后来想了想,就是实现交换操作. 原始代码: texture->imageDa ...

  5. 【c语言】输入两个数,交换这两个数后,再输出

    <程序设计基础实训指导教程-c语言>杨莉 龚义建 科学出版社 ISBN 978-7-03-032846-5 p9 2.1.2 上机实训内容 [实训内容3] 编程实现:输入两个数,交换这两个 ...

  6. 指针,指针:分装一个函数,实现两个数的交换。 指向固定的区域

    1.指针的引入 //第9行,取值运算符*,他把后面跟的内存地址中的数据"取出来": 2.指针变量的引入 什么是指针变量:存放地址的变量 什么是指针变量:存放指针的变量 指针 = 地 ...

  7. 实现两个数的交换(异或,加减)

    1. 通常我们通过设置临时变量来实现两个数的交换,如下: void swap(int *a,int *b){int temp;temp=*a;*a=*b;*b=temp;} 2.还可以通过异或来实现两 ...

  8. (1)输入直角三角形的两个直角边的长度a,b,求斜边c的长度 (2) 编写一个程序,用于两个数的交换

    (1)输入直角三角形的两个直角边的长度a,b,求斜边c的长度 (2) 编写一个程序,用于两个数的交换 import math a = float(input('请输入直角三角形直角边a的长度:')) ...

  9. 实现两个数交换python_编写一个程序,用于实现两个数的交换。_学小易找答案

    [判断题]定喘穴定位在胸部 (10.0分) [其它]实现实心等腰三角形图案打印输出. [其它]编写一个程序,用于实现两个数的交换. [其它]实现空心等腰三角形图案打印输出. [判断题]表寒肺热证的代表 ...

最新文章

  1. 关于appcan自动升级功能
  2. PIX515防火墙配置策略实例
  3. 上海市高校精品课程“网络安全技术”
  4. redis live 如何安装
  5. python中反向切片用法_使用Python中的切片[:0:-1]反转列表
  6. reflectasm --反射工具
  7. Fisher准则一维聚类
  8. 初识java atomic
  9. python实现嵌套功能_python3 os进行嵌套操作的实例讲解
  10. 5G来了,普通人看热闹,程序员看颠覆
  11. 商户/服务商微信支付开发文档【 直连模式/服务商模式】如何在公众号、小程序中接入微信支付?
  12. eMule中的server无法连接问题
  13. 分享几个国内外安全专家常用的漏洞库平台
  14. Java 抽奖活动循环编程练习
  15. 【学习笔记】分布式追踪Tracing
  16. 防CC攻击 软件防火墙和WEB防火墙大比较
  17. 使用移动云MAS HTTP接口发送短信BASE64加密中文乱码
  18. 恶意软件Emotet卷土重来滥用.LNK文件进行攻击,你只需要一项技术就能有效保护组织
  19. 华为手机摄影从入门到精通_华为手机拍照技巧从入门到精通
  20. jQuery 实现贪吃蛇游戏

热门文章

  1. 织梦动态PHP可以删除吗,DeDe织梦cms如何全站动态化,取消静态功能
  2. java 扫描包框架_在Android中实现类似Spring的软件包扫描
  3. js 自动关闭html页面,JS关闭窗口或JS关闭页面的几种代码分享
  4. MySQL数据库锁构建_MySQL数据库InnoDB存储引擎中的锁机制
  5. “输入字符不是 MATLAB 语句或表达式中的有效字符”的解决办法
  6. 【 FPGA 】组合逻辑中的竞争与险象问题(三)
  7. 纯CSS3实现GIF图片动画效果
  8. nc/netcat/ncat/nmap/socat Tips
  9. IOS、Android html5页面输入的表情符号变成了乱码”???“
  10. html5 实现手机摇一摇功能(C)