题目:java
package cglib;算法
import java.util.Stack;安全
public class jiekou {spa
//第1种办法
public void changeMethodA(int a, int b){
System.out.println("changeMethodA交换以前\ta:"+a+"\tb:"+b);
a = a + b - (b = a);
System.out.println("changeMethodA交换以后\ta:"+a+"\tb:"+b);
}
//第2种办法
public void changeMethodB(int a, int b){
System.out.println("changeMethodA交换以前\ta:"+a+"\tb:"+b);
b = a + (a = b)*0;
System.out.println("changeMethodA交换以后\ta:"+a+"\tb:"+b);
}
/** 它的原理是:把a、b看作数轴上的点,围绕两点间的距离来进行计算。
具体过程:第一句“a=b-a”求出ab两点的距离,而且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),而且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),而且将其保存在a中。完成交换。
此算法与标准算法相比,多了三个计算的过程,可是没有借助临时变量。(如下称为算术算法)
缺点:是只能用于数字类型,字符串之类的就不能够了。a+b有可能溢出(超出int的范围),溢出是相对的, +了溢出了,-回来不就行了,因此溢出不溢出不要紧,就是不安全。
* @param args
*/
public void shift(){
int a,b;
a=10;b=12;
a=b-a; //a=2;b=12
b=b-a; //a=2;b=10
a=b+a; //a=12;b=10
System.out.println("a = " + a);
System.out.println("b = " + b);
}
/** 经过“+”运算符将a和b的运算结果赋给了a(这时a是中间变量)。而后再计算b,这时a的值已是(a+b)了,
* 所以,a再减b就是原来的a。 而这时b已是原来的a了,
* 所以,再用运算后的a(其实是a+b)减运算后的b(其实是原来的a),
* 就是原来的b了,最后将这个b赋值给a。
* @param args
*/
public void shift1(){
int a = 13;
int b = 21;
a = a + b; //a=34,b=21
b = a - b; //a=34,b=13
a = a - b; //a=21,b=13
System.out.println("a = " + a);
System.out.println("b = " + b);
}
public void swap2()
{
int a = 2;
int b = 5;
if(a*b<=0){
System.out.println("值不能有0");
}
a = a * b;//a=10,b=5
b = a / b;//a=10,b=2
a = a / b;//a=5,b=2
System.out.println("a = " + a);
System.out.println("b = " + b);
}
public void swap3()
{
int a = 7;
int b = 8;
a = a - b;//a=-1,b=8
b = a + b;//a=-1,b=7
a = b - a;//a=8,b=7
System.out.println("a = " + a);
System.out.println("b = " + b);
}
public void swap5()
{
int a = 3; //011
int b = 4; //100
a = a ^ b;//a=011^100=111,b=100
b = a ^ b;//a=111,b=111^100=011
a = a ^ b;//a=111^011=100,b=011
System.out.println("a = " + a);
System.out.println("b = " + b);
}
public void exchange(int x,int y)
{
Stack<Integer> s = new Stack<>();
s.push(x);
s.push(y);
x=(int) s.pop();
y=(int) s.pop();
System.out.println("x = " + x);
System.out.println("y = " + y);
}
public void exchange2(String a,String b)
{
a=a.concat(b);
System.out.println("将b粘贴到a后面,a = " + a);
b=a.replace("b","");
System.out.println("b被空格替换后b = " + b);
a=a.replace("a","");
System.out.println("a被空格替换后a = " + a);
System.out.println("最后a = " + a);
System.out.println("最后b = " + b);
}
public void exchange3(String a,String b)
{
//先转成int,而后用上面的
// a=a+b;
// b=a-b;
// a=a-b; 最后再转成String
a = ( b + a ).substring(0,(b + ( b = a)).lastIndexOf(a)) ;
System.out.println("a = " + a);
System.out.println("b = " + b);
}
public static void main(String[] args) {
jiekou m = new jiekou();
m.shift();
m.shift1();
m.swap2();
m.swap3();
m.swap5();
m.changeMethodA(19,20);
m.changeMethodB(57,75);
m.exchange(2,10);
m.exchange2("a","b");
m.exchange3("a","b");
}
}.net
输出:
a = 12
b = 10
a = 21
b = 13
a = 5
b = 2
a = 8
b = 7
a = 4
b = 3
changeMethodA交换以前 a:19 b:20
changeMethodA交换以后 a:20 b:19
changeMethodA交换以前 a:57 b:75
changeMethodA交换以后 a:75 b:57
x = 10
y = 2
将b粘贴到a后面,a = ab
b被空格替换后b = a
a被空格替换后a = b
最后a = b
最后b = a
a = b
b = a指针
总结:字符串
1)加减法、乘除法、异或法get
2)使用中间变量(指针、引用)string
3)当要求不使用指针,而且不使用中间变量时,只能使用异或法ast
4)当是浮点数时,不能使用异或法
5)当b为0时,不能使用乘除法