不使用第三个变量实现元素之间的交换

解决这类的问题的关键的在于:运算可逆,逻辑可逆

只要有+就可以用-返回去

有*就可以用/返回去

用^可以用^返回去

还有一个巧妙的方法将三步操作合为一步

我这里用java写,用c的自己加*

第一种

void change(int a,int b){

a=a*b;

b=a/b;

a=a/b;

}

该方法中我们用乘法新产生一个值,用除法将值还原回去

缺点:用乘法使元素变大,类型内存溢出


第二种

void change(int a,int b){

a=a+b;

b=a-b;

a=a-b;

}

该方法中我们用加法新产生一个值,用减法将值还原回去

缺点:降低了乘法内存溢出的可能,但是还会有内存溢出的可能


第三种

void change(int a,int b){

a=a^b;

b=a^b;

a=a^b;

}

使用逻辑上的异或操作,很好的避免了内存问题。


下面两种方法中,为了不使用第三方变量,我们将三步操作合为一步

于是就不需要第三方变量了

第四种

void change(int a,int b){

a=a+b-(b=a);

}

第五种

void change(int a,int b){

a=b+0*(b=a);

}

我见到还有使用堆栈的,只为实现交换元素用堆栈是不是有点杀鸡用牛刀的感觉

点赞