如何更优雅地交换a和b的值?
数据交换在我们平时代码中是很常见。通常都是使用一个中间临时变量,来实现。
var a=3,b=5;
var temp;
temp = a;
a = b;
b = temp;
相信大家平时这使用很是常见,但是个人觉得应该有优雅的方法。
例如:
var a=3,b=5;
a = [b,b=a][0];
不知道有没有别的有意思的方法?
最新的es6可以这样写
在firefox控制台下可以测试
var a = 3,b = 5;
[a,b] = [b,a];
>>a=5
>>b=3
关于效率
对以下两种做了1亿次执行
var swap1 = function(a,b){
var temp;
temp = a;
a=b;
b=temp;
}
var swap1 = function(a,b){
a=[a,a=b][0];
}
分别执行时间为
第一种方式, real:0.128s
第二种方式, real:0.930s
从效率上来说,第一种方式效率较高,不过对于亿级别的计算,一般使用,差异极小。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(20)
论优雅,我觉得没有比临时变量更好的。
优雅是给人看的,不需要注释,不需要解释,不存在某些hack方案中在边际条件下挂彩的可能,能让人直观看明白、让机器高效地完成任务,这个就是优雅。
至于这个,你可以说很geek,很有黑客精神,但是这个跟优雅没半毛钱关系。
但要說看上去很 geek ,看上去很優雅的寫法,可以參考以下:
寫成異或版本:
突然覺得改一下那道題就可以了~
性能:
http://jsperf.com/exchange-variables-gracefully
不過要說真正的優雅,還是要靠語言級的支持。
CoffeScript的话可以像Python那样写的很优雅:
网上非常多的算法,
仅举一例:
PHP
Golang 也可以很优雅的
C++
swap(a, b);
Java
{
int t = a;
a = b;
b = t;
}
Python
a, b = b, a
python
Ruby也可以这么写
优雅,见仁见智,但是性能的确是需要知晓的一方面 http://jsperf.com/exchange-value 差得是有点多,毕竟创建数值损耗大
php:
list(a,b) = array(b,a);
ruby
a,b = b,a
java
a = a + b;
b = a - b;
a = a - b;
Haskell:
但严格地说Haskell中并不允许改变已经被赋过值的variable的值
如果使用C++,可以直接使用
std::swap
例如:如果你使用C+11,那么完全不必担心效率问题。因为C++11使用移动构造函数用来构造变量,不会产生额外的内存拷贝只是指针的移动。
与其说优雅,不如说更高效,但又不失其可阅读性。是不是什么事情都要讲优雅?
a = (a + b) - (b = a + b - b);
看到很多a+b, 记得a+b可能会溢出的说。。。