解决这类的问题的关键的在于:运算可逆,逻辑可逆
只要有+就可以用-返回去
有*就可以用/返回去
用^可以用^返回去
还有一个巧妙的方法将三步操作合为一步
我这里用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);
}
我见到还有使用堆栈的,只为实现交换元素用堆栈是不是有点杀鸡用牛刀的感觉