logo头像

Hello World

【算法】变量交换

我们常见的两变量交换会采用第三个变量。
本文记录几个不使用临时变量交换方法。

  • list 简洁 不改变变量类型适用所有变量类型
    1
    2
    3
    4
    5
    6
    <?php
    $a = "你好";
    $b = "世界";
      echo $a.$b;//输出 “你好世界”
      list($b,$a) = [$a,$b];
      echo $a.$b;//输出 “世界你好”
  • ^异或 适用于等长文本和int类型
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    $a = 98;
    $b = 12;
    var_dump($a);//int(98)
    var_dump($b);//int(12)
    $a = $a^$b;
    $b = $b^$a;
    $a = $a^$b;
    var_dump($a);//int(12)
    var_dump($b);//int(98)

经过测试list方法和异或方法执行时间毫秒级暂时看不出区别。

但是内存方面list方法会比异或方法占用要多一点。

事实上,
List的方法虽然简洁,但是内存开销比新建一个中间变量还要大。。

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$a = 9899999;
$b = 4546464;
var_dump($a);
var_dump($b);
$t1 = microtime(true);
$a = $a^$b;
$b = $b^$a;
$a = $a^$b;
$t2 = microtime(true);
echo '耗时'.($t2-$t1).'微秒<br>';
echo 'Now memory_get_usage: ' . memory_get_usage() . '<br />';
var_dump($a);
var_dump($b);
/*
int(9899999) int(4546464) 耗时1.9073486328125E-6微秒
Now memory_get_usage: 352232
int(4546464) int(9899999)
*/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$a = 9899999;
$b = 4546464;
var_dump($a);
var_dump($b);
$t1 = microtime(true);
list($b,$a) = [$a,$b];
$t2 = microtime(true);
echo '耗时'.($t2-$t1).'微秒<br>';
echo 'Now memory_get_usage: ' . memory_get_usage() . '<br />';
var_dump($a);
var_dump($b);
/*
int(9899999) int(4546464) 耗时1.9073486328125E-6微秒
Now memory_get_usage: 352312
int(4546464) int(9899999)
*/
上一篇