leetcode-1

之前说是要刷北大的JudgeOnline,结果种种理由没有去刷,但实验室的师兄告诉了我一个不错的在线编程,讨论的网站,题目不是很多,也不是针对ACM,主要是针对面试的,我想这个应该就很有用了,废话不说先贴网站,LeetCode

LeetCode OJ is a platform for preparing technical coding interviews. Pick from an expanding library of more than 140 questions, code and submit your solution to see if you have solved it correctly. It is that easy!

bootstrap的风格,很是nice,150+的题目,据说刷上几遍面google的实习生的coding interview都有了机会,尽管现在看上去没有什么用,但算法这个东西毕竟是计算机的基础之一,有时候在想计算机科班出身能比别人强在哪?培训机构出来的也可以做网站、写各种app,甚至像hadoop,mapreduce也不在话下。那科班有什么意义呢,新东方学电脑好了,我想对算法的敏感度是一个不得不提的问题,在上课期间,学C,学数据结构,等等这些无非不是让你对算法有个意识,对数据结构有个意识,而不再是简简单单的解决问题,多了这一层次的思考也许就能写出更好的代码。

废话不多说了,我在leetcode里面刷的题目也不多,但是对比较好的题目总结一下肯定不是坏事。而且这个习惯要坚持下去。

Evaluate Reverse Polish Notation

波兰式,应该是学栈最经典的题目吧,LIFO,o(n)的复杂度。

Single Number

Given an array of integers, every element appears twice except for one. Find that single one.这个问题简单的做法就是建个字典,找到出现一次的数,时间复杂度是o(n),但空间复杂度也是O(n),但空间复杂度怎么从O(n)降到O(1)呢?自己木有想到,看了discuss才找到怎么做,利用位运算,取^(异或)。

这个我用python写的了,用了字典,空间复杂度高

def singleNumber(self, A):
    b = {}
    for item in A:
        if item not in b:
            b.setdefault(item, 1)
        else:
            b[item] += 1
    for item in b:
        if b[item] == 1:
            return item

这是discuss里面的网友提出来的,相当漂亮,用了异或,相等的两个数异或为0,留下的那个就是single number了

int num=0;
for(int x : A) num ^= x;
return num;

当然这个问题还有一个进阶版啦,就是Single Number II ,原来的两个数变成了三个数,当让O(1)的空间复杂性的算法我还没懂,如果懂了立刻贴过来。

Two Sum

这个问题在面阿里实习生的时候被问过,想出了nLog(n)的算法,当然,被面试官教育了o(n)的算法,不过空间换时间嘛,精髓就是hash了,当然这个问题还可以扩展,比如题目中每个数不止出现一次,于是我把value改成了list,如果这里面的数很多很多,hash都不够了该咋办。

呃,只有我那个nLog(n)的算法,大概是先排序,然后首尾变量,移动。在编程之美2.12中也是有这个问题的,同时也是有各种进阶版,我会在想一下进阶版的问题,分享出来。