peking2 的leetcode 总结

好多人问,我就发到这里吧。

面试题的构成和分类

首先声明一下,这里的面试题主要所指数据结构和算法的题目,题目的分析集中在
Leetcode上面的题目上。

我认为一道面试题由以下几个方面组成的

Question

Data structure in question

Data structure in solution

Algorithm in solution

Coding

题目:非常关键,一个题目通常有一些相应的变形题目,同一个题目可能有不同的要求
。比如时间复杂度,空间复杂度的要求,比如recursive,
iterative的要求。而根据题目的变形与要求,可能会极大的影响到你能够采取的数据
结构和算法。

问题中的数据机构:问题中有可能带数据结构,有可能没有数据结构,有可能是可以自
定义数据结构

解决方案中的数据结构:可以是in-place的,也就是利用已有的数据结构,也可能是创
建新的数据结构。新的数据结构跟已有的数据结构没有必然的联系,而很多问题都是一
题多解,可能采取不同的数据结构。

算法:一般来说,当解决方案中的数据结构确定以后,算法也就确定了。同样,一旦解
决方案的算法确定,相应的数据结构也就确定了。这两个没有先后的关系,但解决方案
中的数据结构和算法具有非常紧密的联系。

代码:非常关键。代码就是解决方案的数据结构和算法的实现了。目前来看,题目,数
据结构和算法在面试中出现的类型比较固定,因此代码的好坏则是拉开面试者水平的一
个有效手段。这也是为什么F,G如此看中代码的质量了。我发现上面几点比较容易突击
,但是写代码的功力还是需要实打实的积累的。

总结面试题目的关键就是要把面试题目进行分类之后分析。由于面试题目由以上几个部
分组成并且混杂在一起,因此怎样合理的分类就变得非常的困难。其实Careercup150的
分类就比较好,它是这样进行分类的。

数据结构:Arrays and Strings, Linked Lists, Stacks and Queues, Trees and
Graphs

算法:Bit Manipulation, Mathematics and Probability, Recursion and
Dynamic Programming, Sorting and Searching

但是我感觉这样分类比较适合初级阶段学习,并不适合系统地对面试题目进行分析。我
其实目前也没有什么特别好的idea,想跟着感觉先来,可能慢慢就能悟出更多了。

Peking2面试题总结(2) - Two/Three pointers
简称two pointers吧。大概把分类粗略的搞了一遍(http://leetcode.cloudfoundry.com/),
发现利用two pointers解决的题目数量很大。two pointers我指的是一类题,而不一定
是真正的two pointers,
比如可能是three pointers, 也可能不是pointer, 而是index。这类题基本上就是发
生在array,
string, linked
list这三种数据结构上,是一种基本的算法和编程技巧,同样超高频率的出现,可以说
是面试必遇的题。

two pointers常常和其他的算法混杂起来出现。比如binary search本身也可以归类为
two
pointers的。如果这样算的话,Leetcode上边1/4的题目都跟它相关。因此,two
pointers是必须熟练掌握的基本编程技巧。

Two pointers大概分三种类型

  1. 两个pointers从头往后走:感觉绝大多数的linked
    list的题目都涉及到这个操作,当然还有array。这类题目很多时候又可以称为sliding
    window。

Implement strStr()

Longest Substring Without Repeating Characters

Minimum Window Substring

Remove Duplicates from Sorted Array &
II

Remove Duplicates from Sorted List & II

Remove Element

Remove Nth Node From End of List

Reverse Linked Llist II

Rotate List

Substring with Concatenation of All Words

Swap Nodes in Pairs
2.
两个pointers从两头往中间走:一般面试出现的的都是singly linked list,
因此这类题主要是array题。

3Sum

3Sum Closest

4Sum

Container With Most Water

Sort Colors

Trapping Rain Water

Two Sum

Binary search (will discuss it in a separate section)
3.
两个pointers控制两个不同的数组或链表:一般出现在跟merge相关的题目上。

Add Binary

Add Two Numbers

Merge Sorted Array

Merge Two Sorted Lists

Multiply Strings

Partition List

Peking2面试题总结(3) - Permutation and Combination
基本题,但是非常重要。面试中碰到任何一题一点也不奇怪。PIE,
CC150和Leetcode都不约而同地包含了这类题。把这些题目做熟是必须的。基本上来说
这类题的解法都是DFS,程序的大体框架非常类似,只是根据题目的要求代码稍作修改
。当然每道题也有不同的解法,但是你应该根据自己的喜好把这类题目的解决方案统一
化。熟悉了这类题目以后对于DFS(will
be discussed in a separate section)
的理解会非常深刻。基本上一般的DFS的题目应该没什么问题了。

无论是排列还是组合,这类题都有一个变形,就是要求不能有重复的输出。PIE和CC150
都没有提到相应的解法,大家应该很好的体会一下。如果没有相应的准备,属于面试的
时候比较容易跪的题目。

Permutation

输入没有重复:Permutations, CC150 9.5, PIE Chapter7 Permutations of a
String
输入有重复,输出不能有重复:Permutations
II

Next Permutation: 经典算法,背吧

Permutation Sequence: 非常有意思的题目

Combination

纯粹的subset

输入没有重复:Subsets, CC150 9.4, PIE Chapter7 Combinations of a
String
输入有重复,输出不能有重复:Subsets
II

需要满足一定要求的组合

一个元素只能取一次(输入没有重复): Combinations

一个元素可以取多次(输入没有重复): Combination Sum, CC150
9.8
一个元素只能取一次(输入有重复,输出不能有重复):
Combination Sum II

Gray Code: 具有subset的序列特点 (考虑CC150 9.4 Solution#2:
Combinatorics)

Peking2面试题总结(4) - 数据结构和算法

下边是我认为面试中常见的数据结构和算法,以Java的类库作为标准。

数据结构

Array, ArrayList

String, StringBuffer

LinkedList

HashMap, HashSet

Stack and Queue

Tree:

BT: binary tree

BST: binary search tree,

Balanced BST (red-black tree): TreeMap, TreeSet

Trie: prefix tree

Heap: PriorityQueue
Grpah

注意:

Array和Linkedlist是最最基本的数据结构,因为他们可以构造很多其他的数据结构,
比如String
(C语言里String就是字符数组),HashMap, Stack和Queue
(Java里Queue就是LinkedList实现了Queue的interface;
Ruby里stack和queue都是array), 以及Heap。

Heap is a tree logically, but array physically.

HashMap, Stack and
Queue通常不会出现在问题里的数据结构中,因此一般作为solution的数据结构。但是
面试中也常会让你实现这三种数据结构,另外就是CC150的3.2和3.5都是典型的Stack和
Queue的题。Leetcode中并不涵盖这些内容,这几种数据结构在Leetcode中都是作为
solution数据结构出现的
(没有的原因是这些题目不太适合OJ,因此需要单独练习)。

目前Leetcode还不包含graph的题型

算法

Sort: quick sort, merge sort, count sort, heap sort, bucket sort,
radix sort, external sort, K selection etc.

Merge: 2 array/list merge, k-way merge, interval merge
etc.

Binary search:

Stack:

Recursion and Iteration:

DFS:pre-order, in-order, post-order for trees

BFS: 需要用Queue

DP: Top down and bottom up

Greedy:

Toposort: 需要用Queue

注意:

Leetcode并没有包含各种sort算法,而通常面试很少让你直接去实现sort算法,但是大
部分的相关编程技巧是包含在很多题目当中的,
比如quick sort的two pointers。

Merge跟sort是紧密相关的,单独拿出来是因为有很多这个类型的题目,需要一起总结
。Merge操作的对象基本都是已经排好序的。

Stack虽说是数据结构,但是一般出现在solution里,因此代表了一类算法

Toposort面试作为难题也很有可能遇到,目前Leetcode还没有包括进去

Peking2面试题总结(5) - Binary search and divide and conquer

玩竞赛对面试不利的一个地方就是面试经常遇到的数据结构比如LinkedList, Tree, 和
算法Binary
search,竞赛很少涉及到,因此一直心里都感觉到有些不安。

Binary search非常tricky,虽说道理简单,但是面试的时候却很容易出bug,因此总结
一下是必须的。假设i=0,
j=A.length-1, 我做了一下LeetCode上的所有binary
search的题目,发现了以下几点值得注意。

终止条件不同 i<=j, i

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值