java-lintcode阶梯训练第六章

         llintcode第六章,目前lintcode差不多只刷完这章了。。。第七章只有两道题,一个是节点公共祖先的题目,我复习树的算法的时候写过,一个string转int,leetcode刷过这题,重新写一遍而已。第八章目前只刷了一道题。

        感觉第六章也没啥可说的。。。 只有这道题,剑指offer上的原题,如果事先不知道答案的话,真的很难找到最优解:

给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。

 关键是,没有额外空间,O(n)的时间,实在抱歉,, 最开始我没做出来,不过这种题就像游泳一样,如果事先见过的话,以后再见他肯定知道思路在什么地方了。。

      其实很简单,就是利用了一个亦或的特性:

a^b^a = b

     就是说在亦或算式中,两个相同的数字可以相互约掉,代码很简单,看完他原理的人应该都会做。

      不过今天看这个的时候,突然想到另一个问题:交换两个int变量的值,一般情况下我会这样

int temp = a;
temp = a;
a = b;
b = temp;

 这样写肯定是没问题的,不过显得low一点,而且如果你面试,也挺容易被面试官继续问的(可以不用多于空间吗)

      后来这么写:

a = a + b;
b = a - b;
a = a - b;

 这个就显得比上一个高那么一点点(其实真实项目中,他俩的差别绝对绝对是忽略不计的),不过逼格要高那么一点点,如果真是在面试中写这种题,逼格真的挺重要的,挺唬人的吧     就像销售面试的时候忽悠面试官一样,这其实也是一种从技术上忽悠面试官的一种办法,让他觉得你逼格高,自然印象就会好一点

     然后,今天又学到另一种方法:

a = a ^ b;
b = a ^ b;
a = a ^ b;

        有没有觉得逼格瞬间提高一个档次。。。 我记得以前的博客说过,在进行int型数据计算的时候,位运算绝对是装逼神器(在真实项目中,很少能碰到需要进行位运算的项目(目前我只见过密码运算的时候碰到过),)。。。但是,上面这三种代码给人的感觉真的不一样,至少我这么觉得,我的第一印象,写第三种代码的人,编程一定比前两种代码强,面试嘛,第一印象很重要的。

 

public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a = 2;
		int b = 3;
		a = a ^ b;
		b = a ^ b;
		a = a ^ b;
		System.out.println(a);
		System.out.println(b);
	}

        结果:

3
2

 

猜你喜欢

转载自709002341.iteye.com/blog/2271692