如何不使用任何额外空间实现两数相互交换
来源:互联网 发布:mac怎么关闭系统弹出 编辑:程序博客网 时间:2024/06/05 02:51
这个是Cracking the code interview的题目,如一般的交换函数我们都知道:
void mySwap(int &a, int &b){int t = b;b = a;a = t;}
但是如何实现这个函数,不使用t呢?
有两种方法,第一种方法,利用减法实现:
void swapWithoutTemp(int &a, int &b){a = a-b;b = a+b;a = b-a;}
这很好理解,难理解的是第二种方法,利用异或运算^位操作实现:
void swapBitOp(int &a, int &b){a = a^b;b = a^b;a = a^b;}
理解起来还是有点难度。
那是利用了异或运算的特征,就是:
任何数与1异或都相当于取反操作,例如1^1=0; 0^1=1
任何数与0异或都相当于保留操作:1^0 = 1; 0^0 = 0;
理解方法:
由特殊推导一般,就是假设两个数都是一位二进制数,那么就算他们是多位二进制数的情况也是一样的。
假如b为1,就是对a做取反操作
a = a^b;就是对a取反了a = !a;
b = a^b; 就相当于!!a对a作了两次取反操作,那么就肯定等于a了。
a = a^b;就是 !a ^ a,那么就肯定等于1了.因为b=1的所以就是a = b了。
假如b为0,就是对a做保留操作
a = a^b;就是对a保留操作a = a;
b = a^b; 再次对a作保留操作,那么就肯定等于a了。
a = a^b;就是a ^ a,那么就肯定等于0了.因为b=0的所以就是a = b了。
两个关键点:
1 知道异或运算的特征
2 从一般推导到特殊
- 如何不使用任何额外空间实现两数相互交换
- 如何不适用任何额外空间,交换两个数的值
- 不使用额外空间来交换两个数
- 在不使用额外空间,交换两个数
- 不占用任何额外空间的情况下交换两个数的值
- 不占用任何额外空间的情况下交换两个数的值
- 【刷题之路】不使用额外空间交换两个数
- 不使用额外空间实现两个变量(int 型)的交换
- 不使用任何额外变量,实现倒序字符串
- python实现不使用额外的空间判断输入数字是否是回文数
- 不用额外空间,交换两个数
- 不使用中间变量交换两数
- python实现不使用额外空间去除重复元素
- 字符串按照单词反序(增加额外空间和不增加额外空间两种实现方法)
- 用位运算实现两个变量交换值(不需额外空间)
- 深入理解异或运算 xor 的含义——再探不使用加减乘除实现加法运算、不使用额外空间交换两个变量的值
- 【C++】判断一个数是不是回文数,不使用额外的空间
- java基础-------不使用第三个参数实现两数交换
- Linux平台代码覆盖率测试工具GCOV简介
- Ibatis报错
- vim折叠设置(转载)
- Spring2.5+MINA2搭建Socket Server
- linux下添加新的路由
- 如何不使用任何额外空间实现两数相互交换
- 设置窗口透明度
- 第13 周项目用递归法求n!
- 进程
- HDOJ 1212 Big Number
- 关于集合框架类的学习笔记
- 马老总的PK理论
- 常见适配器的用法(在listview中 ,把三个edittext内容放在简单适配器中)
- 另一个求阶乘