最近我遇到了这个问题编写一个函数来交换两个数字而不使用额外的空格?该函数可以有两种方式:
int swap ( int *a, int* b)
{
*a = *a+*b;
*b = *a-*b;
*a = *a-*b;
}
另一种方式是异或操作:
int swap ( int *a, int* b)
{
*a = *a^*b;
*b = *a^*b;
*a = *a^*b;
}
即使这两个函数都是一个好主意,如果a和b都指向单个内存位置,它们将无法工作?如何解决这个问题?
答案 0 :(得分:5)
问题在数学中是显而易见的。
int swap ( int *a, int* b)
{
*a = *a+*b;
*b = *a-*b;
*a = *a-*b;
}
当a
和b
指向同一位置时,上面的代码变为
*a = *a + *a; // *a = 2 x (*a)
*b = *a - *a; // = 0
*a = *a - *a; // = 0
因此,*a
和*b
都为零。因此,您应该使用if
:
int swap ( int *a, int* b)
{
if (a!=b)
{
*a = *a+*b;
*b = *a-*b;
*a = *a-*b;
}
}
同样适用于xor
版本。
答案 1 :(得分:2)
#define SWAP(a, b) (((a) == (b)) || (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))))
答案 2 :(得分:1)
为什么任何人在不使用额外空间的情况下交换两个号码?
什么虐待狂会为你提供足够的空间而不是三个?
为什么你称之为'空间'呢?这只是第三个数字,没有必要提到一个充满真空的广场。
该算法使用临时使用O(1)空间的交换操作次数。这是数字长度的O(n),但在处理器不友好的情况下,很可能是比特错误和算术的。
如果你没有足够的空间容纳一个简单的数字,你就会耗尽空间。在这种情况下,我无法看到你可以从交换中去哪里。
为什么不首先将两个数字存放在适当的位置?
答案 3 :(得分:-1)
你可以试试这个, A = A + B; B = A-B; A = A-B;