Edit Distance@LeetCode

2015-04-12
阅读 1 分钟
3k
典型的动态规划题目。维护一个二维数组dis[][],dis[i][j]表示:word1的前i个元素与word2的前j个元素的edit distance值。递推关系为:

Text Justification@LeetCode

2015-04-11
阅读 3 分钟
3.8k
首先,筛选出一行中应该包括的单词,这里要考虑空格还要占用掉的长度,也就是除了当前的总长度之外,还需要记录下纯单词的长度,这样方便之后生成相应的空格。

Valid Number@LeetCode

2015-04-10
阅读 2 分钟
2.2k
首先,对字符串左右去空格,然后根据字符e来进行划分,e之前的归为底数,e之后的归为指数。这个时候在使用Java的split()函数时要注意的时当分隔符是原字符串的首字母时,拆分之后的数组的第一个元素会是空字符串。所以,其实我们在去空格之后就可以对原字串做一些判断,直接筛选掉一些明显错误的情况。

Insert Interval@LeetCode

2015-04-08
阅读 4 分钟
2.7k
我当时的想法非常朴素,就是用带插入的区间去原区间列表中一个个比较,问题就出在这个比较的结果会很多,可以看到我代码里面用了5个值来代表5中不同的比较结果(这里的前后是以数轴为坐标):

Java 用自定义类型作为HashMap的键

2015-04-07
阅读 4 分钟
19k
这是Java中很经典的问题,在面试中也经常被问起。其实很多书或者文章都提到过要重载hashCode()和equals()两个方法才能实现自定义键在HashMap中的查找,但是为什么要这样以及如果不这样做会产生什么后果,好像很少有文章讲到,所以写这么一篇来说明下。

Merge Intervals@LeetCode

2015-04-07
阅读 2 分钟
3k
这也是一题我有点不太能理解为什么可以标为hard的题目。解法其实很直观,就是先对interval进行排序,然后遍历一遍。这里需要注意的点有两个:

N-Queens I II@LeetCode

2015-04-06
阅读 3 分钟
3.4k
N-Queens N皇后问题,非常经典。同时也是非常传统的递归方法解决。 递归的主体很简单:对于当前位置,分别尝试下放皇后和不放皇后两种情况。这里有两个需要注意的地方: 在递归函数中,在一次递归中,对整行进行遍历,这样相当于在检查的时候就不需要对当前行进行检查了,因为赋值的时候已经保证了当前行只有一个皇后。 ...

Jump Game II@LeetCode

2015-04-06
阅读 1 分钟
4.6k
比较典型的贪心。维护一个区间,区间表示第i步所能到达的索引范围。递推的方法为:每次都遍历一遍当前区间内的所有元素,从一个元素出发的最远可达距离是index+array[index],那么下一个区间的左端点就是当前区间的右端点+1,下一个区间的右端点就是当前区间的max(index+array[index]),以此类推,直到区间包含了终点,...

Wildcard Matching@LeetCode

2015-04-03
阅读 2 分钟
2.2k
一开始是非常想用递归的方法做的,因为前面已经有做正则表达式的经验了,所以认为这一题应该是同样的思路做。但是小数据集还好,大数据集根本过不去,分析了一下,主要是要回朔的地方太多了,或者是需要处理的分支实在太多。

Java泛型:泛型类、泛型接口和泛型方法

2015-04-03
阅读 3 分钟
118.1k
Container类保存了一对key-value键值对,但是类型是定死的,也就说如果我想要创建一个键值对是String-Integer类型的,当前这个Container是做不到的,必须再自定义。那么这明显重用性就非常低。

Trapping Rain Water@LeetCode

2015-04-02
阅读 2 分钟
2k
Trapping Rain Water 这道题当时也是花了我不少脑力呀,总感觉方法就在边上了,但是总是差一点点。 这一题的主要问题就在于:如何找到『坑』。 其一,理论上来讲,如果当前处在上升阶段(y在增大),那么就应该正在形成一个『坑』。 其二,知道现在处在『坑』了,就该算坑有多大,但是这里的难点在于如果以当前点为『坑...

First Missing Positive@LeetCode

2015-04-01
阅读 1 分钟
2.1k
我的解法是将所有正数都先放到map里面,然后就从小正数——也就是1——开始检查map,遇到的第一个不包含在map中的正数便是答案。最坏情况下的复杂度是O(n)。

Sudoku Solver@LeetCode

2015-03-31
阅读 2 分钟
3.1k
主体还是一个递归函数,找出当前适合的数后再递归调用。找出合适的数的方法就是遍历9个数字填充到当前位置,然后用验证函数进行验证,然后验证通过就继续调用递归函数解出下一个位置,如果验证不通过就再尝试下一个数字。如果遍历了一遍都没有发现合适的数字,那么就返回false。当发现所有空位都填充满了之后,就可以返...

Search in Rotated Sorted Array@LeetCode

2015-03-30
阅读 2 分钟
2k
其实不太能理解为什么这题能标成hard,因为用很直观的算法便可以解出来。由于数组是被翻转过的,所以被分成两个部分,每个部分又都是有序的。所以先判断先判断一下要查找的数是在前半段还是后半段,然后依次查找即可。

Permutations I II@LeetCode

2015-03-29
阅读 2 分钟
2k
递归的方法,设置一个used数组,用来记录相应位置是否已经使用过了,然后设置一个permutation数组,用来保存当前的序列,如果当前序列长度到达额定长度后,将该序列加入最后结果集合中。

Longest Valid Parentheses@LeetCode

2015-03-29
阅读 1 分钟
1.8k
这也是不知道方法前很纠结,知道方法之后很简单就能搞定的题目。解题的核心就是维护一个左括号栈和站内元素起点索引,之所以要维护一个匹配起始索引,是因为在匹配过程中先前已经匹配的元素可能已经出栈了,其索引无法获取所以要提前记录下来,在维护的过程中可能遇到两种情况:

Substring with Concatenation of All Words@LeetCode

2015-03-27
阅读 3 分钟
6.8k
比较复杂的一题,首先是要明确用滑块的概念来解决,始终保持L集合中的字符串在滑块中都只出现了一次,当然设置一个总计数count,当cout等于L集合长度时,即使找了一段符合要求的字符串。

Reverse Nodes in k-Group@LeetCode

2015-03-26
阅读 2 分钟
4.9k
先介绍下翻转链表的写法: 1. 首先设置一个前置节点,将前置节点的next设置为头节点,以头节点为当前节点,开始循环 2. 将当前节点的next赋给一个临时节点,然后将当前节点的next指向前置节点,随后依次位移前置节点指针和当前节点指针:前置节点指针指向当前节点,当前节点指针指向临时节点,这样就完成了一次循环 3. ...

Merge k Sorted Lists@LeetCode

2015-03-26
阅读 2 分钟
2k
当初看到这题的第一反应是每次都遍历一遍所有头节点,然后选出最小的连接到已排序链表的末尾。这个想法当然能够解决问题,但是性能上肯定是过不去的。因为这样相当于没排序一个元素就是需要比较m次(m为链表条数),那么最后的复杂度就是O(nm)(n为元素总数)。

Regular Expression Matching@LeetCode

2015-03-24
阅读 2 分钟
2.7k
当模式串为空时。检查内容串是否为空(为空则返回true,反之返回false)。注意这里反过来是不成立的,也就是不能检查当内容穿为空时,模式串是否为空,因为如果模式串最后一个字符是*,那么即便此时模式串不为空,总结结果也有可能是true。

Median of Two Sorted Arrays@LeetCode

2015-03-23
阅读 1 分钟
2.3k
其实思想很简单:要寻找第k小的元素,那么总是保持数组A的当前元素(即A[a])为当前最小元素(如果不是,则交换A和B数组,使这一条成立),然后弹出该元素(即++a),然后再递归调用寻找第k-1小的元素。

当你访问淘宝的时候,发生了什么?

2015-03-20
阅读 1 分钟
4.6k
因为准备阿里的面试(这个问题以前在阿里的笔面试中出现过),所以把这个问题还翻出来复习了一下。太细节的地方背起来当然没什么意义,这里我就整理每一步大概做了哪些事情以及涉及到阿里相关的那些技术。

Dungeon Game@LeetCode

2015-03-19
阅读 2 分钟
3.8k
首先从重点开始,这里需要注意的是,终点的血量求负之后是需要加1的,例如重点值是-5,那么进入终点时的血量就应该是6,不然到终点血量变为0了也是失败。然后需要注意的是如果进入终点前所需的血量小于1,那么就应该以1记,因为如果是血量小于1就直接失败了。

堆和堆排序

2015-03-18
阅读 4 分钟
3.4k
堆的定义 堆是一种常见的数据结构,具体定义可以见维基百科。 程序设计中实用的数据结构中对于堆的定义如下: 二叉堆是一棵满足下列性质的完全二叉树。 如果某节点有孩子,且根节点的值都小于孩子节点的值,我们称之为小根堆。 如果某节点有孩子,且根节点的值都大于孩子节点的值,我们称之为大根堆。 二叉堆的树结构同...

Largest Number@LeetCode

2015-03-18
阅读 2 分钟
2k
Largest Number 典型的窍门题,就是知道了诀窍之后很简单就能搞定。不像有些题目,比如动态规划,即便知道了是用什么方法,但求递推公式还是要花很大的力气。 这题最大的难点就在于:当一个数是另一个数的前缀时,如何排列它们顺序。(其他情况很简单,就按照字符串默认的排序规则就行) 解决方法是:比较两个数o1和o2时...

String, StringBuffer和StringBuilder

2015-03-17
阅读 2 分钟
3k
在Java中,String是不可变类型,所以对于字符串的操作提供了两个辅助类:StringBuffer和StringBuilder。 这个两个类的主要区别在于: StringBuilder的效率更高 StringBuffer是线程安全的,而StringBuilder不是 不过,需要注意的是,在利用+对String对象直接进行拼接的时候,Java内部其实还是用StringBuilder来实现的,但...

Rotate Array@LeetCode

2015-03-17
阅读 1 分钟
2.6k
这题当然有很朴素的解法,例如利用k % nums.length次循环每次循环都将原字符串向右推移1位,或者直接计算出每个字符最终所应该在的位置直接进行赋值。

Repeated DNA Sequences@LeetCode

2015-03-17
阅读 2 分钟
3.2k
Repeated DNA Sequences 这一题经典的用二进制序列表示字符串序列,以减少内存消耗的例子。 题目中提到DNA序列只包含四种碱基对,分别用A,C,G和T表示,那么就可以用二进制数来分别代表它们: A:00 C:01 G:10 T:11 那么形如ACGT的DNA序列就可以表示为00011011,也就是27。而且这个值对于所有DNA序列都是唯一的,那...

面试查漏补缺——阿里

2015-03-17
阅读 1 分钟
3.7k
阿里电话面试 面试时间:2015-03-16 Java StringBuffer和StringBuilder的区别的问题。 String,StringBuffer与StringBuilder的区别?? StringBuilder and StringBuffer 简单来说:StringBuilder的效率更高;StringBuffer是线程安全的,而StringBuilder不是线程安全的。 快排性能 平均时间:O(nlogn) 最差情况:O(n ^ 2) 稳...

Factorial Trailing Zeroes@LeetCode

2015-03-15
阅读 1 分钟
2k
阶乘,或者说乘法,为什么会产生0,就是因为有2和5的存在,那么只要对输入n进行分解,有多少个2和有多少5就能知道最后的数中会有多少个0。进一步简化,简单地根据规律就可以知道质因子2的数量肯定是多余质因子5的,因为每出现一个5,就起码在之前出现了两个2,那么这个问题就简化为求输入n的质因子中有多少个5。