如何优雅的交换两个变量的数值
如何优雅的交换两个变量的数值
前言
今天说一个很常见的算法题,如何交换两个数字的数值。题目如下:
现有两个变量,int a = 1,int b = 3;
如果交换两个变量使得 a = 3,b = 1;
说明: a1表示第一步结束后的a变量,a2表示第二步,依次类推,本篇全文适用
解法
普通常用法
1 | int temp = a; |
这种方法没什么说的,创建临时变量存储a值,将b值赋值给a变量,再从临时变量中将原a值赋值给b变量。交换完成。
加减法
1 | a = a+b; |
步骤分析:
- a1 = a+b
- b2 = a1-b
b2 = a+b-b
b2 = a - a3 = a1-b2
a3 = a+b-a
a3 = b
利用两数之和减去其中一个等于另一个。但是这种方法容易越界。
乘除法
1 | a = a*b; |
原理与加减法一致
异或法
主角来了!!!
1 | a^=b; |
解析:
首先要了解异或的算法。
- 任意一个变量X与其自身进行异或运算,结果为0,即X^X=0。
- 任意一个变量X与0进行异或运算,结果不变,即X^0=X
- 异或运算具有可结合性,即abc=(ab)c=a(bc)
- 异或运算具有可交换性,即ab=ba
现在来分析运算步骤: - a^=b
- a1 = a^b;
- b^=a
- b2 = b^a1;
- b2 = bab;
- b2 = a;(bb等于0且0a等于a)
- a^=b
- a3 = a1^b2;
- a3 = aba;
- a3 = b;(aa=0且0b=b)
总结
加减法与乘除法易越界、异或法效率最高。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 KTHIRTY!