一道面试题:用多种方法实现两个数的交换
很多程序经常使用的最普通,比较常见的,也是比较简单的一个算法
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
一道面试题:用多种方法实现两个数的交换相关推荐
- 用指针和函数的方法完成两个数的交换
<程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p142 7.1.2 上级实训内容 [实训内容6]用指针和函数的方法完成两个数的交换 传递规则:主函数 ...
- c++ std 方法 取两个数的较大_【数据结构C++】两数交换(4种方法)
一.语言:C++ 二.内容:通过函数调用实现两个数的交换 三.方法: 正常函数交换 引用类型的函数交换 指针类型的函数交换 宏函数定义交换(不常见) #include <iostream> ...
- 创建方法求两个数的最大值max2,随后再写一个求3个数的最大值的函数max3。 要求:在max3这个函数中,调用max2函数,来实现3个数的最大值计算
//创建方法求两个数的最大值max2,随后再写一个求3个数的最大值的函数max3.//要求:在max3这个函数中,调用max2函数,来实现3个数的最大值计算public static int max3 ...
- 【C/C++】异或操作巧妙实现两个数的交换操作
今天在看OpenGL加载TGA格式图像用作纹理的代码时,看到关于RGB(A)顺序转换的一行代码时,捉一开始感到很困惑,后来想了想,就是实现交换操作. 原始代码: texture->imageDa ...
- 【c语言】输入两个数,交换这两个数后,再输出
<程序设计基础实训指导教程-c语言>杨莉 龚义建 科学出版社 ISBN 978-7-03-032846-5 p9 2.1.2 上机实训内容 [实训内容3] 编程实现:输入两个数,交换这两个 ...
- 指针,指针:分装一个函数,实现两个数的交换。 指向固定的区域
1.指针的引入 //第9行,取值运算符*,他把后面跟的内存地址中的数据"取出来": 2.指针变量的引入 什么是指针变量:存放地址的变量 什么是指针变量:存放指针的变量 指针 = 地 ...
- 实现两个数的交换(异或,加减)
1. 通常我们通过设置临时变量来实现两个数的交换,如下: void swap(int *a,int *b){int temp;temp=*a;*a=*b;*b=temp;} 2.还可以通过异或来实现两 ...
- (1)输入直角三角形的两个直角边的长度a,b,求斜边c的长度 (2) 编写一个程序,用于两个数的交换
(1)输入直角三角形的两个直角边的长度a,b,求斜边c的长度 (2) 编写一个程序,用于两个数的交换 import math a = float(input('请输入直角三角形直角边a的长度:')) ...
- 实现两个数交换python_编写一个程序,用于实现两个数的交换。_学小易找答案
[判断题]定喘穴定位在胸部 (10.0分) [其它]实现实心等腰三角形图案打印输出. [其它]编写一个程序,用于实现两个数的交换. [其它]实现空心等腰三角形图案打印输出. [判断题]表寒肺热证的代表 ...
最新文章
- 关于appcan自动升级功能
- PIX515防火墙配置策略实例
- 上海市高校精品课程“网络安全技术”
- redis live 如何安装
- python中反向切片用法_使用Python中的切片[:0:-1]反转列表
- reflectasm --反射工具
- Fisher准则一维聚类
- 初识java atomic
- python实现嵌套功能_python3 os进行嵌套操作的实例讲解
- 5G来了,普通人看热闹,程序员看颠覆
- 商户/服务商微信支付开发文档【 直连模式/服务商模式】如何在公众号、小程序中接入微信支付?
- eMule中的server无法连接问题
- 分享几个国内外安全专家常用的漏洞库平台
- Java 抽奖活动循环编程练习
- 【学习笔记】分布式追踪Tracing
- 防CC攻击 软件防火墙和WEB防火墙大比较
- 使用移动云MAS HTTP接口发送短信BASE64加密中文乱码
- 恶意软件Emotet卷土重来滥用.LNK文件进行攻击,你只需要一项技术就能有效保护组织
- 华为手机摄影从入门到精通_华为手机拍照技巧从入门到精通
- jQuery 实现贪吃蛇游戏
热门文章
- 织梦动态PHP可以删除吗,DeDe织梦cms如何全站动态化,取消静态功能
- java 扫描包框架_在Android中实现类似Spring的软件包扫描
- js 自动关闭html页面,JS关闭窗口或JS关闭页面的几种代码分享
- MySQL数据库锁构建_MySQL数据库InnoDB存储引擎中的锁机制
- “输入字符不是 MATLAB 语句或表达式中的有效字符”的解决办法
- 【 FPGA 】组合逻辑中的竞争与险象问题(三)
- 纯CSS3实现GIF图片动画效果
- nc/netcat/ncat/nmap/socat Tips
- IOS、Android html5页面输入的表情符号变成了乱码”???“
- html5 实现手机摇一摇功能(C)