如何不使用任何额外空间实现两数相互交换
2013-11-19 20:19
337 查看
这个是Cracking the code interview的题目,如一般的交换函数我们都知道:
但是如何实现这个函数,不使用t呢?
有两种方法,第一种方法,利用减法实现:
这很好理解,难理解的是第二种方法,利用异或运算^位操作实现:
理解起来还是有点难度。
那是利用了异或运算的特征,就是:
任何数与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 从一般推导到特殊
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 型)的交换
- 如何不适用任何额外空间,交换两个数的值
- 深入理解异或运算 xor 的含义——再探不使用加减乘除实现加法运算、不使用额外空间交换两个变量的值
- 如何交换两个int值,而不使用额外的空间
- Linux有问必答:如何扩展XFS文件系统 完全使用额外空间
- 另一道看上去很吓人的面试题:如何交换a和b两个整数的值,不用额外空间 (Rev. 2)
- Linux如何扩展XFS文件系统以完全使用额外空间
- 不占用任何额外空间的情况下交换两个数的值
- 使用异或运算实现两数交换
- 另一道看上去很吓人的面试题:如何交换a和b两个整数的值,不用额外空间 (Rev. 2)
- 另一道看上去很吓人的面试题:如何交换a和b两个整数的值,不用额外空间 (Rev. 2)
- 不使用额外空间来交换两个数
- 如何使用ActionBar+ViewPager实现fragment相互切换
- 使用交换表空间和传输表空间来实现大表的迁移——exchange partition
- java基础-------不使用第三个参数实现两数交换
- 不占用任何额外空间的情况下交换两个数的值
- 另一道看上去很吓人的面试题:如何交换a和b两个整数的值,不用额外空间 (Rev. 2)
- UNIX 如何使用交换空间
- 另一道看上去很吓人的面试题:如何交换a和b两个整数的值,不用额外空间 (Rev. 2)
- 如何将a,b的值进行交换,并且不使用任何中间变量