面试题:交换两个类型不知的变量的值,不能用第三个变量

交换两个变量的值,实在太过简单,比如:

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");
	}

 

上一篇:有趣的"=="与"==="


下一篇:菜单树数据形成