如何更优雅地交换a和b的值?

发布于 2022-09-04 02:00:53 字数 805 浏览 20 评论 0

数据交换在我们平时代码中是很常见。通常都是使用一个中间临时变量,来实现。

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(20

老子叫无熙 2022-09-11 02:00:53

论优雅,我觉得没有比临时变量更好的。

var a=1;b=2;
var temp=a;
a=b;
b=temp;

优雅是给人看的,不需要注释,不需要解释,不存在某些hack方案中在边际条件下挂彩的可能,能让人直观看明白、让机器高效地完成任务,这个就是优雅。

var a=3,b=5;
a = [b,b=a][0];

至于这个,你可以说很geek,很有黑客精神,但是这个跟优雅没半毛钱关系。

萌梦深 2022-09-11 02:00:53
a = a ^ b; b = b ^ a; a = a ^ b;
世俗缘 2022-09-11 02:00:53

沒有語言級別的支持,就沒有真正的優雅。這時,最簡單最自然的寫法纔是真正的優雅。

但要說看上去很 geek ,看上去很優雅的寫法,可以參考以下:


寫成異或版本:

var a = 5, b = 3;
a = (b = (a ^= b) ^ b) ^ a;

突然覺得改一下那道題就可以了~

var a = 5, b = 3;
a = -(b = (a += b) - b) + a;

性能:

http://jsperf.com/exchange-variables-gracefully


不過要說真正的優雅,還是要靠語言級的支持。

梦在深巷 2022-09-11 02:00:53
a += b, b = a-b, a -= b;

CoffeScript的话可以像Python那样写的很优雅:

[b,a] = [a,b]
耳钉梦 2022-09-11 02:00:53

网上非常多的算法,
仅举一例:

b=a+0*(a=b)   这个错误(@wangsquirrel指出)
a=b-a+(b=a) ;这个可以
他不在意 2022-09-11 02:00:53
var a = 0;
var b = (a++, 99);
console.log(a);     // a = 1
console.log(b);     // b = 99
长亭外,古道边 2022-09-11 02:00:53

PHP

list($a, $b) = array($b, $a);
桜花祭 2022-09-11 02:00:53

Golang 也可以很优雅的

a, b = b, a
噩梦成真你也成魔 2022-09-11 02:00:53

C++
swap(a, b);

Java

{
int t = a;
a = b;
b = t;
}

Python
a, b = b, a

墨落画卷 2022-09-11 02:00:53

python

a, b = b, a
栀梦 2022-09-11 02:00:53

Ruby也可以这么写

a, b = b, a
凶凌 2022-09-11 02:00:53

优雅,见仁见智,但是性能的确是需要知晓的一方面 http://jsperf.com/exchange-value 差得是有点多,毕竟创建数值损耗大

深海蓝天 2022-09-11 02:00:53

php:
list(a,b) = array(b,a);

兲鉂ぱ嘚淚 2022-09-11 02:00:53

ruby
a,b = b,a

感情废物 2022-09-11 02:00:53

java
a = a + b;
b = a - b;
a = a - b;

清风不识月 2022-09-11 02:00:53

Haskell:

(\(x,y)->(y,x))(a,b)

但严格地说Haskell中并不允许改变已经被赋过值的variable的值

嗼ふ静 2022-09-11 02:00:53

如果使用C++,可以直接使用 std::swap 例如:

int a = 1, b = 2;
std::swap(a, b);

如果你使用C+11,那么完全不必担心效率问题。因为C++11使用移动构造函数用来构造变量,不会产生额外的内存拷贝只是指针的移动。

template <class T> void swap (T& a, T& b)
{
  T c(std::move(a)); 
  a=std::move(b); 
  b=std::move(c);
}
凉城已无爱 2022-09-11 02:00:53

与其说优雅,不如说更高效,但又不失其可阅读性。是不是什么事情都要讲优雅?

℡Ms空城旧梦 2022-09-11 02:00:53

a = (a + b) - (b = a + b - b);

随梦而飞# 2022-09-11 02:00:53

看到很多a+b, 记得a+b可能会溢出的说。。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文