有 a 和 b 两个数值,不借助额外空间的情况下,一种交换两个值的方式是:
a = a + b;
b = a - b;
a = a - b;
通常来说不会有啥问题,但偏偏遇上了。
arr[i] = arr[i] + arr[j];
arr[j] = arr[i] - arr[j];
arr[i] = arr[i] - arr[j];
乍一看,没问题。但实际上没这么简单。
假设 i 和 j 从数组的两头分别遍历,在某些条件下需要交换。那么问题来了,当 i 和 j 遍历到同一位置,做一次“无伤大雅”的交换,会发生什么呢?
arr[i] == 0
所以这种用法还是要谨慎。稳妥的方式就是申请额外空间,进行交换,不会出这种岔子。