交换两个变量的值,实在太过简单,比如:
public class TestCh {
public static <T> void change(T a,T b){
System.out.println("交换前a=" + a + "\t b=" + b);
Object c = null;
c = a;
a = b;
b = (T) c;
System.out.println("交换后a=" + a + "\t b=" + b);
}
public static void main(String[] args) {
change(5,10);
}
}
但是不能用第三个变量做媒介,一下子就有些不知所措,尤其是面试的时候,感觉一下好尴尬,其实这个时候,面试官往往考察的是我们队数据结构的掌握和了解程度。所以,临机一动,想到了Map,key和value交换,不就用不到第三个变量了吗?
// 不允许出现第三个变量
public static <T> void changeMap(T a, T b) {
System.out.println("Map交换前a=" + a + "\t b=" + b);
Map<T, T> map = new HashMap<T, T>();
map.put(a, b); // a-key b-value
System.out.println("Map交换后a=" + map.values() + "\t b=" + map.keySet());
}
public static void main(String[] args) {
change(5,10);
changeMap("A","1");
}
但是通过Map交换值的方法感觉实在有些low,如果面试真这样回答了,感觉完全凸显不了能力有木有?而且自己之前面试的时候,Map都没有想到,只想到了一个方法:那就是a+b=sum,然后sum-a就是a,sum-b就是b,这样两个值就交换过来了。然后面试官笑了,问如果两个值是字符串呢?如果是字符串,哈哈,那就难不倒我了,拼接,然后分别截取:
public static <T> void changeAdd(T a, T b) {
System.out.println("运算交换前a=" + a + "\t b=" + b);
System.err.println("判断参数类型是否是字符串型===" + a.getClass().getName());
if(a.getClass().getName().contains("String")){
if (b.getClass().getName().contains("String")) {
// a和b都是字符串
System.out.println("运算交换后a=" + (String.valueOf(a) + String.valueOf(b)).substring(
(String.valueOf(a) + String.valueOf(b)).length() - String.valueOf(b).length() ,
(String.valueOf(a) + String.valueOf(b)).length()));
System.out.println(
"运算交换后b=" + (String.valueOf(a) + String.valueOf(b)).substring(0, String.valueOf(a).length()));
System.out.println();
}
}
// 非字符串型 判断是否是int或者double型
//代码略……
}
public static void main(String[] args) {
// change(5,10);
// changeMap("A","1");
changeAdd("bbbb","10");
}
上述虽然达到了不借用第三个变量进行值交换的目的,但是代码实现起来比较复杂,很容易出错。有没有一种数据结构,能实现两个值交换呢?我们不妨考虑栈(Stack)结构,利用先进后出,不就达到交换的目的了么?
/**
* 利用栈数据结构 对于两个数交换其实是最简单的 先进后出
* @param args
*/
public static <T> void changeStack(T a,T b){
System.out.println("Stack交换前a=" + a + "\t b=" + b);
Stack<T> st = new Stack<T>();
st.push(a);
st.push(b);
System.out.println("Stack交换后a=" + st.pop() + "\t b=" + st.pop());
}
public static void main(String[] args) {
// change(5,10);
// changeMap("A","1");
// changeAdd("bbbb","10");
changeStack("bbbb","10");
}