前两天,去看见一个面试题目,如下:
不使用中间变量的情况下,怎么直接实现两个数的互换?
最容易想好的方法就是使用中间变量
public static void swap(int x,int y)
{
int temp = x;
x = y;
y = temp;
System.out.println(x+""+y);
}
但题目要求不使用中间变量。于是就不知道怎么弄了。问百度,发现还有几种方法,具体直接通过程序显示如下:
/**
* @author ZDQ
*
*/
public class SwapTest {
public static void swap1(int x, int y) {
int temp;
temp = x;
x = y;
y = temp;
}
public static void swap2(int x, int y) {
System.out.println("方法一:加减(会造成溢出)");
x = x + y;
y = x - y;
x = x - y;
System.out.println(x + " " + y);
}
public static void swap3(int x, int y) {
System.out.println("方法二:乘除(会造成溢出)");
x = x * y;
y = x / y;
x = x / y;
System.out.println(x + " " + y);
}
public static void swap4(int x, int y) {
System.out.println("方法三:异或");
x = x ^ y;
y = x ^ y;
x = x ^ y;
System.out.println(x + " " + y);
}
/**
* @param args
*/
public static void main(String[] args) {
int a = 1;
int b = 2;
// 方法一
swap2(a,b);
// 方法二
int a1 = 3;
int b1 = 4;
swap3(a1,b1);
// 方法三
int a2 = 5;
int b2 = 6;
swap4(a2,b2);
}
}
结果如下:
方法一:加减(会造成溢出)
2 1
方法二:乘除(会造成溢出)
4 3
方法三:异或
6 5
说明:使用加减操作的时候,当两个数的和超出范围时,就会异常。乘除操作时,就更容易溢出,且除数不能为0.
异或则是根据的数据的编码得推到的。
PS:主要说的是,拿到两个数的交换问题,首先想到的是,利用中间变量实现。
而题目规定不能采用中间变量,看看其他的几种方式,可能异或想不到,但是加减应该是可以考虑到的。
之所以,拿到题目不值所云,主要就是缺少一个思考问题的习惯,现在的工作主要针对一些规范的API调用,致使大脑很多时候就按照规范的模式在运转,缺乏独立思考创造的能力。
鉴于此,个人应该花一些时间在算法题目上。