交换2个变量的方法有哪些

时间:2011-08-25 04:00:26

标签: algorithm

我知道这些。还有其他方法吗?哪一个更好?

  1. 使用临时变量
  2. 使用一些算术运算
  3. 使用按位异或操作
  4. 我认为最好的方法是XOR实施。有什么建议吗?

5 个答案:

答案 0 :(得分:4)

任何不使用临时变量/寄存器的东西都保证不会一直工作。因此不建议使用它。

按位XOR交换不适用于同一个变量。(http://en.wikipedia.org/wiki/XOR_swap_algorithm#Reasons_for_avoidance_in_practice

'没有临时变量交换的算术'会出现溢出问题。

另请注意,如果使用临时进行简单交换,则编译器足够智能,可以在不使用临时变量的情况下将其转换为程序集。如果你试图过度智能,那么

  1. 您的代码将以相同或更慢的方式结束AND
  2. 您的代码肯定不太可读。

答案 1 :(得分:1)

这两个二元操作#@是彼此相反的,以下算法也会交换a和b的值:

a = a # b
b = a @ b
a = a @ b

希望这有帮助。

答案 2 :(得分:0)

我认为使用临时变量解决方案要好得多,因为:

  • 易于阅读
  • 可以在多种类型之间使用
  • 结果不是算术/逻辑运算
  • 没有溢出相关问题
  • 一个额外的内存空间不是一个巨大的开销

查看以下链接:

答案 3 :(得分:0)

也可以是元组解包:

Python 2.7.1 (r271:86882M, Nov 30 2010, 10:35:34) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 4
>>> b = 23
>>> a, b = b, a
>>> a
23
>>> b
4
>>> 

答案 4 :(得分:0)

根据您的语言和选项的复杂程度,选项d)是交换内部指针。例如,如果您有自己的字符串对象(实际上您使用的是您喜欢的语言的标准库),它可能包含整数长度和指向存储字符串的内存的指针。交换字符串对象的实例时,只交换长度和指向数据的指针,而不是数据本身。