交换两个数字而不使用额外的空间,如果两个数字都指向相同的位置,则不起作用

Swapping two numbers without using extra space not working if both point to same location?

本文关键字:数字 两个 不起作用 位置 空间 交换 如果      更新时间:2023-10-16

最近我遇到了这个问题写一个函数来交换两个数字而不使用额外的空间?函数有两种形式:

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都指向单个内存位置,它们将不起作用?如何解决这个问题?

这个问题在数学上很明显。

int swap ( int *a, int* b)
{
    *a = *a+*b;
    *b = *a-*b;
    *a = *a-*b;
}

ab指向同一位置时,上述代码变为

*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版本。

#define SWAP(a, b) (((a) == (b)) || (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))))

为什么任何人交换两个数字而不使用额外的空间?

哪个施虐狂会给你足够的空间容纳两个人而不是三个人?

你为什么叫它"空间"呢?这只是第三个数字,没有必要暗指一个巨大的、充满真空的地方。

使用临时的算法在交换操作次数中使用O(1)空间。数字的长度是0 (n),但很可能在给定一个对处理器不友好的n的情况下,摆弄位的数字和算术数字也是O(n)。

如果你没有足够的空间来存储一个简单的数字,你只是用光了空间。在这种情况下,我看不出你能从交换中得到什么。

为什么不首先将这两个数字存储在它们的适当位置?

你可以试试这个,= a + b;b = a - b;一个= a - b;