两个数组要与它们的值互换,我正在寻找方法来不使用第三个数组。怎么可以解决?我看到一些算术方法(如下所示)用于整数,但无法用字符串数组解决我的问题。
int a[350]={350 values};
int b[350]={350 values};
for(int i=0;i<350;i++)
{
a[i]=a[i]+b[i];
b[i]=a[i]-b[i];
a[i]=a[i]-b[i];
}
答案 0 :(得分:4)
如果要迭代数组,则不需要新数组;只需一个临时变量即可,每次迭代都可以重复使用。
如果禁止任何新的内存分配,那么只要数据类型是完整的,就可以使用算术或XOR解决方案。
for(int i = 0; i < 350; ++i)
{
a[i] = a[i] + b[i];
b[i] = a[i] - b[i];
a[i] = a[i] - b[i];
}
// or
for(int i = 0; i < 350; ++i)
{
a[i] ^= b[i];
b[i] ^= a[i];
a[i] ^= b[i];
}
最后,你总是可以交换数组指针!
object[] a;
object[] b;
object[] temp;
temp = a;
a = b;
b = temp;
答案 1 :(得分:2)
为什么要使用任何荒谬的技巧?你不能省去一个int
临时的吗?
for(int i=0;i<350;i++)
{
std::swap(a[i], b[i]);
}
或
std::swap_ranges(a, a+350, b);
注意:在我的机器上,XOR技巧通常需要两倍于交换使用单个临时变量。
答案 2 :(得分:0)
如果数组是完整的,你可以使用xor技巧:
for(int i = 0; i < 350; ++i) {
a[i] = a[i] ^ b[i];
b[i] = a[i] ^ b[i];
a[i] = a[i] ^ b[i];
}
不需要临时工具
答案 3 :(得分:0)
在C ++中,您可以将bit xor用于指针(我假设字符串为char*
或wchar_t*
)。但实际上我并不认为一个变量对你有害,而且只使用std::swap
会更好。
答案 4 :(得分:0)
更好:
for(int i = 0; i < 350; ++i)
{
a[i] ^= b[i];
b[i] ^= a[i];
a[i] ^= b[i];
}
答案 5 :(得分:0)
我猜作者的问题是不使用第三个数组交换数组。所以我认为只使用一个变量就足够了。
int tmp = 0;
for( int i = 0; i < 350; ++i )
{
tmp = a[i];
a[i] = b[i];
b[i] = a[i];
}
为什么要使用某些xor操作?
答案 6 :(得分:0)
你的解决方案不起作用:它实际上说明了一个简单的问题,许多人偶然发现了。
算法的描述通常不会考虑计算机具有的有限内存表示。
特别是在这里,int
只能保存这么多位,因此添加可能会导致溢出,这是未定义的行为(在x86上,它包装,但是其他处理器可能会触发硬件异常)。
有两个正确(和简单)的解决方案来交换两个int
:
int tmp = lhs; lhs = rhs; rhs = tmp;
,也称为swap
lhs ^= rhs; rhs ^= lhs; lhs ^= rhs;
,也称为XOR技巧两者显然适用于阵列。
另一种更高效的解决方案是交换阵列本身。
std::swap(a,b);
注意:如果数组是静态分配的,则不可能直接交换它们,但是你可以完全只使用指向静态分配的数组的指针,从而交换指针
警告:已经有数组引用的对象将不会收到交换通知,在这种情况下,除了交换内容之外别无选择。