交换两个数字而不使用额外的空间,如果两个数字都指向相同的位置,则不起作用
Swapping two numbers without using extra space not working if both point to same location?
最近我遇到了这个问题写一个函数来交换两个数字而不使用额外的空间?函数有两种形式:
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;
}
当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
版本。
#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;
相关文章:
- C++通过数字比较两个数字
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 在 txt 文件中显示前两个数字的程序
- 两个有符号数字之间的距离
- 形成一个斐波那契三角形,使得每个数字是上面左对角线或右对角线上两个数字的总和
- 将数字表示为两个三角形数字的总和
- 两个数字的对称配对功能
- 无法理解代码背后的逻辑,这是在两个给定数字之间生成素数的优化问题
- 查找中间两个数字的正则表达式的匹配项
- 使用C++具有两个数字的最短路径算法.(C++)
- 将两个数字添加为链表
- C++ 分段错误:11 错误,同时编码将两个数字相加的链接列表
- 如何对两个 4 位数字进行乘法,将它们视为 C++ 中的多项式
- 在手臂氖中高效计算两个不同的数字
- 如何在 c++ 中添加两个大的双精度数字
- 我应该如何使用remove_if删除两个数字范围内的元素
- C++显示两个区间之间的数字的程序检查一个数字是否可以表示为两个素数的总和
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- 如何在两个不同大小的向量中找到公共数字
- 如何使用C++中不是文字的变量在数字中显示单引号和两个引号?假设 6'2" 英尺