0%

Algorithm

首先声明一点,面试是面试,做题是做题,做题是面试的必要条件。接下来 ,就我做了这些题的感悟,主要是给自己做个纪念,也分享下我的见闻。

1 说说我认识的刷题套装

编辑器 : vscode sublime 都行, 不过我偏好IDEA的原因是因为可以写单元测试,这对我复习,调试并验证我的代码正确性很重要。
IDEA 也可以调成文本编辑模式, 点击IDEA右下角的帽子图标,取消code auto complete。取消syntax 或者 highlight都行。

250道包含内容:2个top系列为主+外加一些高频题目和自己认为薄弱的题目

2 leetcode外挂插件 : 目前 有了已经开发了leetcode刷题插件,不需要取网页端浏览,直接编辑器里面浏览,自动生成。

https://github.com/shuzijun/leetcode-editor

网页端的一个油猴插件 : 自动切换国区和美区 , 搜索答案 , 个人用的还算不错 。 具体功能自己装个油猴插件 ,自己玩玩吧
https://greasyfork.org/zh-CN/scr … 3%E5%8A%A9%E6%89%8B

3 推荐参考答案: grandyang的文字解答 和 花花酱的视频 为主。还有 水中的鱼 , LEE215 等

个人主观评价:花花酱做的视频基本很精品,覆盖的题目都比较全了,也做了分类。适合小白和一定刷题经验的人。
每个视频时长基本控制在20min以内,讲的很好,好在除了 给你解题思路和复杂度简略分析,还会融会贯通,连带在视频内 提示并放出相关类似的题目的YouTube视频链接。
花花酱本人的履历 我也算搜过, 看他的解答 很放心!
答案的基本版本是 C++一定有。 Python和JAVA 现在也带上了。
唯一缺点就是:没有评论区,YouTube视频下面贴代码也不太好。

然后再来说说,grandyang的, 文字描述功底 我认为早期版本可能不太行,后期版本都是不错的。
他的文字性题解思路描述 可以 让你在5min内了解这道题目的大致解题思路,不用费心思看你可能认为20min很长会让你睡觉的视频解答。
grandyang 尽量都提供一题多解,并在文章末尾附上原题链接和 JAVA C版本的vote数较高的答案。
当然,我后说grangdyang,是因为我个人觉得他的部分答案,没讲到关键点子上。。。比如DP类型的 背包问题 ,举个例子 312 burst ballon 区间DP
所以, grandyang的答案的缺点是在于, 有些经典题目 可能并没有 帮助你了解这类型问题的本质。
最后,这只是我的个人看法,从心里面上来说,我很感谢两位提供这么棒的答案。

LEE215 不错了 ,不过没有思路讲解,吸收的养分比较少。但是代码写的是整洁!
其他收费的视频,我直言很垃圾 ,缴纳智商税。。。。走捷径不是不可以,但是那些弯路你最后还是要走,为什么硬要把他们分离开,先走捷径呢?

4 关于学习材料:除了leetcode还有什么可以看看的?

这个问题,比较难回答。
我之前也买了刘汝佳的算法竞赛入门经典(第2版) 还有配套答案和训练集。
https://book.douban.com/subject/25902102/
最后也没仔细去学,不过当做参考书也还是不错的。
前期我还去了解了USACO CODEFORCE HDOJ POJ ZOJ TopCoder 等等是干啥的。
至于编程之美和微软技术面试心得 剑指offer我没学过 好像有些经典题目就是从这里出的。

这里,我想推荐下 https://oi-wiki.org 这个面向初高中的OIER的网站, 网站发起人目测是THU的。。

这个网站,我获取了什么有用的信息?
我从OI的视角,将leetcode题目置于 OI领域,看看主要考察什么。
毕竟leetcode一定程度上就代表面试算法题部分的考察项目嘛
dp分类 字符串处理 数论 基础的数据结构 位运算的基本和灵活应用,
线段树 树状数组 区间DP 树形DP RMQ ST表等了解或理解

另外,就是崔添翼大佬的背包九讲V2,我个人的学习能力停留在第六章,第七章及以后的 听不太懂。。。
前面几章相当经典,是培养我DP启蒙的一个小册子。感谢这位大佬 撒花🌸🌸🌸🌸🌸🌸🌸🌸
暂时想到的就这些。

5 算法和数据结构学习应该有怎么样的顺序: 我个人犯的错误就是前期刷题质量和效率太低,埋了很多雷。

首先 二分查找 左闭右开的lower_bound写法一定要理解 。这是一种思想。而不是简单的查找数值!!
排序的话,快排 和快排的切分 默写程度吧,3向快排和归并排序 也要能默写咯 ,其他自己看着办吧

接下来谈谈 栈和队列的运用的
基于栈LIFO的数据结构特点,DFS的非递归肯定用栈啦,单调性栈 的运用 这个自己去体会吧。
队列的话 FIFO特点, BFS 肯定用得上了 。 BFS问题 比如课程表,接雨水Ⅱ

优先队列 用在哪里 ? top k系列问题 以及 依赖于优先队列的BFS遍历
二叉堆和二叉树 ,高度, 深度 ,叶子结点 ,非叶子节点 ,这个需要理清楚 。
二叉树 基本上用递归为主了 。遍历方式:递归,非递归,morris遍历 , 高度和深度计算 。
链表的话 考察的比较少 环检测 翻转链表 必须会吧 ,哑节点dummynode的运用。
树状数组 ST表 就是一个二进制倍增思想的运用吧,这个在崔添翼大佬的背包九讲里面有提及,我认为可以不用学,尝试下还行。UF的话 也比较常见,这个还好了,碰到的比较简单,要么连通性判断,要么连通图个数计算。

6 刷题用什么语言: 从功利性角度来看 JAVA C++比较稳了,毕竟leetcode答案 语言版本也是这2种最为常见。

Python 答案 代码是少, 代码少并不代表 你就能容易理解这个答案。
所以经常leetcode讨论区会有show 几行Python代码 solution 我觉得这并没有提供有效的信息。

7 说说leetcode的tag分类: 我认为唯一一点做的不好的是DP分类

dp是一个比较宏大的概念,细分下来有很多种经典的DP,让人印象深刻的股票系列 烧气球 数组切割求最值问题
其他tag归类我认为都okay
以下内容需要积分高于 50 您已经可以浏览

8 leetcode用国区还是美区?我现在用国区。不过我倾向于还是用美区吧。有点自相矛盾哈哈美区毕竟有高质量的讨论,国区比较少,而且可以训练 英文算法题的 阅读理解嘛2333

最近,国区出了一个很弱化的 app。

9 我的做题策略:

5-10min不会,直接看答案,看grandyang或者花花酱的。
起初,我还不好意思。
后来,我发现你看了这道题目确实就会做了,以后碰到,大概率还是会做的,起码有思路,毕竟自己手抄或者理解过
感悟:还是自己做的题目少,对题目的嗅觉不太行。
力求某个YouTube培训机构讲的 争取做到一题多解和多题一解或者说通用解,通用模版

置于细化的做题策略: 个人经验比较少。
基本路子 就是先想想看解题 思路 ,
声明 数据结构变量,初始化赋值 (0,-1,+∞,-∞)。
招到循环调节或者递归更新条件
最后迭代下。。。

至于 担忧15min就放弃思考,以后出新题,你还是可能依旧做不出来?
这个嘛,我认为一半对一半,15min以内想不出,就直接看答案,确实没有培养出解题不投降的意志力,但是也有好处,在于见多识广😄。

10 那些依旧恐惧的题目类型: 字符串的 模式匹配, 栈在计算器的复杂应用,数论题目(数论的题目,基本上属于会就是会,不会就是不会,死也想不出来)。

DP套DP或者 2个DP的题目 , 难呐

11 关于边界, cornercase 的敏感度, 我目前不太会想到,还是自己太菜了。

数组我应该 base 0 还是 base 1 还有off by one error,这个没多少经验。

循环条件 到底 小于 还是 小于等于 ? 我就是用例证法,举个普通的例子,问题规模1到5个内为宜,去判定条件小于还是小于等于。

12 如何二刷,复习和回顾,

这个做leetcode题目之前,就想要写单元测试。
assert 自己答案的输入和输出 ,
方便我以后快速回忆定位某类行题目的答案。
因为leetcode网页版 提交记录里面找自己的答案 不方便。
也有人做Excle, 记录自己的解题关键点。

13 理解和记忆:我目前脑子中记忆的就是 二分 快排切分 ,一些BFS,DFS,DP模版,JAVA常用数据结构的API,尽量理解典型类型的思路,做到万变不离其宗吧 2333,

14 算法题不是数学题,推导可以,证明我还是放弃了 GG。。。。

15 接下去 我要巩固积累,二刷三刷, 学会简要分析时空复杂度,写写自己想出来的test case。

写的比较乱,想到哪里写到哪里,尽量写自己之前比较困惑或者纠结的点 ,记录自己的思考和实践。

最后强调一点就是 面试还是面试,做题还是做题。。。

推荐花花酱的,免费的做的还这么好。有机会,一定要支持下,还有grandyang的。~~撒花 🌸🌸🌸🌸🌸🌸~~

最后,希望有人批判下我的思路感悟

祝愿大家刷题打BOSS 通关。走向人生巅峰哈哈



必知必会:数据结构与算法

license
PRs Welcome
stars
help-wanted
contributors
issues
PRs Welcome

Algorithms + Data Structures = Programs, — Niklaus Wirth

目前来说,程序员的面试门槛越来越高,很多一线互联网公司的技术面试,都或多或少会考察数据结构与算法相关的题目,掌握数据结构与算法尤为重要。如果你不想永远做一名“代码搬运工”,那就花点时间一起来学习吧。本项目涵盖数据结构与算法所有知识点,内容将在后续不断更新,欢迎持续关注项目最新动态。

数据结构与算法概述

线性结构与非线性结构

  • 线性结构
  • 非线性结构

稀疏数据和队列

稀疏数组

  • 看一个实际的需求
  • 基本介绍
  • 应用实例

队列

  • 队列的一个使用场景
  • 队列介绍
  • 数组模拟队列的思路
  • 数组模拟环形队列

链表

链表介绍

单链表应用实例

单链表大厂面试题

双向链表应用实例

单向环形链表应用场景

单向环形链表介绍

约瑟夫问题

栈的一个实际需求

栈的介绍

栈的应用场景

栈的快速入门

栈实现综合计算器

逆波兰计算器

中缀表达式转换为后缀表达式

递归

递归与递归调用机制

递归-迷宫问题

递归-八皇后问题(回溯算法)

排序算法

排序算法介绍

算法的时空复杂度

冒泡排序

选择排序

插入排序

希尔排序

快速排序

归并排序

基数排序

常用排序算法对比总结

查找算法

线性查找算法

二分查找算法

插值查找算法

斐波那契(黄金分割法)查找算法

哈希表

哈希表的基本介绍

Google 公司的一个上机题

树结构

二叉树

  • 为什么需求树这种数据结构
  • 二叉树遍历:前序、中序、后续
  • 二叉树查找与删除

顺序存储二叉树

  • 顺序存储二叉树的概念
  • 顺序存储二叉树的遍历
  • 顺序存储二叉树应用实例

线索化二叉树

  • 先看一个问题
  • 线索二叉树基本介绍
  • 线索二叉树应用案例
  • 遍历线索化二叉树

树结构应用

堆排序

赫夫曼树

赫夫曼编码

  • 数据压缩与解压
  • 文件压缩与解压

二叉排序树

平衡二叉树(AVL 树)

  • 左旋
  • 右旋
  • 双旋转

多路查找树

二叉树与 B 树

B 树、B+ 树和 B* 树

图基本介绍

图的表示方式

图的深度优先遍历

图的广度优先遍历

图的深度优先 VS 广度优先

10 大常用算法

二分查找算法(非递归)

分治算法

动态规划算法

KMP 算法

贪心算法

普里姆算法

克鲁斯卡尔算法

迪杰斯特拉算法

弗洛伊德算法

马踏棋盘算法

入門資料

  • UCB的神课 CS61B,CS61B这个课属于进阶版的java基础班(和CS61A是一个系列的,61A会讲一些基本JAVA的语法),主要讲数据结构,不过这课load还是很重的,作业和Pj都是精挑细选,经过岁月打磨出来的精品。

  • Solutions CS61B

  • 2019 CS61B

  • CS 61B一畝三分地討論交流

台灣目錄:演算法與資料結構

Cornell CS2110

UQER量化交易

簡單的演算法筆記 – 第一集

大佬們的刷題日記和講解

关关刷题日记

https://blog.csdn.net/scarlett_guan/article/list/1?t=1&

Lucky貓的 UVA(ACM)園地

花花酱 leetcode刷题日记 有youtube视频

算法导论 第15章 动态规划

小旭讲解 LeetCode 53. Maximum Subarray 分治策略

參考資料和書籍📚

《算法之美——隐匿在数据结构背后的语言》,全文目录、“45个算法”目录、“22个经典问题目录”。记录学习代码实现,参考:http://www.cnblogs.com/ranjiewen/p/6082573.html

這裡是刷題倉庫和相關資料

[工作信息] 刷题经验贴

CPE TAIWAN Certificate

UVA OJ

UVa submit code的实况

相關活動

交大算法冬令营

blog

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
真的畢業了! 找到適當的BLOG可以寫東西啦~~~就是GOOGLE的BLOGGER!有好多Plugin可以用、template可以自己設定, 在沒有網頁空間下, 覺得這蠻不錯的.

此篇是參考NPSC補完計畫,結合其內容與我的種種解題的學習過程與方法~

身邊的同學或學弟妹常會問如何學程式、提高程式設計能力或者如何解題。

  我不是像中央MORRIS、清大楊易霖、台大以及其他各種怪物等國手,
但是在這多年來解題的過程有許多說不完的心得與想法,
在此分享給想挑戰程式設計比賽的人,
當作一個學習途徑的參考。

  以下內容是以程式解題方向為主的學習過程與方法,無法涵蓋所有程式設計的學習方法,但我想共通點是一樣的。


1. 先熟練C/C++或JAVA基本語法:

  找一本你覺得看起來最舒服的書,
不要說去找什麼很有名的聖經本之類的,
除非底子已經很好,可以再來研讀有深度的書。

最最最最最基本的是需要以下(很重要所以強調):
懂標準輸入輸出、變數宣告、
if-elseswitchwhile(do-while)、for等流程控制語法、
陣列、字串、struct的使用(C/C++)、class的使用(JAVA、c++)
以及簡單的排序法。
進階一點就再學自定函數、遞迴函數等,
這階段主要是學習程式的語法,
讓你的想法可以很快地化成程式碼,
不用馬上說想寫很困難的程式。


2.進入線上程式解題系統練習

學程式絕對不只是要用"看"的就能學會,
學程式絕對不只是要用"看"的就能學會,
學程式絕對不只是要用"看"的就能學會,
學程式絕對不只是要用"看"的就能學會,
學程式絕對不只是要用"看"的就能學會,
(很重要所以我寫五行)
  有些重要課程只有講理論而沒實際操刀寫程式,實在是無法深刻了解其中的奧妙而無法成長,特別是遇到需要 debug 的技巧是書上不會教的!
因為沒有人會有那個耐心幫你檢查所有的程式是不是有 bug,
所以找一個可以自動 Judge 的系統是很重要的~

新手的話,推薦兩個平台

第一個:「高中生程式解題系統」
http://zerojudge.tw/
  歷史非常悠久的台灣中文解題系統,是由高雄師範大學經營,裡面的題庫大都是中文,也是高中職學生常用的解題訓練平台,許多TOI、IOI國手大都在這起步。可惜題目並沒有做難易度分類,即使在基礎題庫的題目也有很難的,需要有人指導會比較清楚。

第二個:「ITSA的E-TUTOR」
http://e-tutor.itsa.org.tw/e-Tutor/
  近年來新的中文解題系統,網站上有中英文的題目,每種題目又有分各類型的題目,
更是有做難易度的區隔,讓學解題的使用者有個清楚的方向。
可惜這平台缺點是常有題目的敘述不完整,比如輸入測資的範圍沒說明等,
會給使用者額外的困擾。

3.開始學習資料結構、演算法

  基本題解到一個程度,會發現學的東西不夠用,
這時候就要進入下一個階段,
開始學習資料結構和演算法了。

  這部分一樣是去書店找一本你看得順眼的書,
以我個人而言,在資料結構的部分,除了有原文聖經本
Ellis Horowitz寫的Fundamentals of Data Structures in C(或C++)
我有另外買蔡明志的「資料結構--使用C++(也有C++、JAVA版)」
另外有網友推薦胡昭民的「圖解資料結構」
選一本即可,主要是看懂資料結構的觀念,
書裡程式碼希望是能研讀,最好是實作。
而有些樹的章節裡面, 只要看到二元樹(包括二元搜尋樹、Heap)就夠了,
後面AVL-Tree、2-3-4 Tree、B-Tree等可以不用看,基本上解題不會用到。

  演算法的書, 之前我上課原文書是用 Anany V. Levitin寫的Introduction to the Design & Analysis of Algorithms,而中文書推薦蔡宗翰的「演算法:使用C++虛擬碼」,這本的內容讓我學到很多。解題的程式最常會用的演算法包含各個擊破法 (Divide-and-Conquer)、動態規劃(Dynamic Programming)、貪婪演算法(Greedy)、
回溯(Backtracking)、分支界限法(Branch-and-Bound)等,有時解題遇到的問題可以用很多種演算法解。
資料結構與演算法的書讀完後,還不足的可以到「演算法筆記」挖資料http://www.csie.ntnu.edu.tw/~u91029/
這網站陪我好幾年,也有我幫站長debug文章的痕跡,可惜現在終止營運,有點可惜~
演算法聖經本是MIT教授Cormen寫的Introduction to Algorithms,以台清交成資訊工程學生以及國手,幾乎都看這本學起,書的內容講的很完整,說是聖經本不為過,真的要讀可以啃這本,但不建議讀中文翻譯本,翻譯的很爛。

4.使用進階的線上程式解題系統

  第二段提到高中生程式解題系統(ZeroJudge)、E-TUTOR
雖然裡面部分題目比較簡單,可以很容易建立自信心、學習基本解題方法。
但到達某一程度後,有些題目會很難、甚至學習成長的幫助不大,此時可以改到其他網站練習。

  首先最推薦的就是最多人用過, 俗稱 ACM 的 UVa Online Judge,
http://uva.onlinejudge.org/
而「Lucky貓的ACM園地」有提供一些題目的中譯還有難易度分級,
http://luckycat.kshs.kh.edu.tw/
可以搭配使用。當然是希望能看原文直接解題是最好,畢竟國際解題全都是用英文出題。

  第 二個是Uhunt,這不是新的解題系統,而是UVa的實況系統,是由新加坡大學的解題團隊所建立的網站,提供現在全世界有哪些人在解題、解題狀況如何、排 名如何、程式執行時間多長,對我而言是個很刺激的網站,且長久下來會看見一些很奇怪的熟ID。而uhunt上中間有一個Competitive Programming Exercises,是新加坡解題團隊所分類的題目,有分好題目類型與難易度,也是提供使用者很完整的解題方向。

5. 進階解題書籍
  前面提的資料結構與演算法書籍,只是"基礎知識"而已,有時學完後還是無法對某些題目想出方法,此時推薦幾本書籍。
第一是劉汝佳撰寫的「算法竞赛入门经典」跟「算法竞赛入门经典——训练指南」
, 在台灣去年有代理出繁體版,名稱分別為《提升程式設計的邏輯思考力─國際程式設計競賽之演算法原理、題型、解題技巧與重點解析》與《提升程式設計的解題思 考力─國際演算法程式設計競賽訓練指南》。這兩本書而言,初學者先讀「算法竞赛入门经典」,讀完後再來讀「算法竞赛入门经典——训练指南」。書的內容就是 專門講解如何將基本的資料結構與演算法知識來解決程式解題的題目。以Uva而言,題目是變化多端,有些題目若沒有人指導確實很難自己想出來,而這些書提供 很多整合資料結構與演算法的概念,提升解題者的思路。
另外一題,劉汝佳起初是中國的解題國手,現任中國專業解題教練與ACM-ICPC命題委員,中國資訊學生幾乎都聽過他名字。他寫了這些書更是帶動中國的解題氣氛,每年上海交通大學幾乎都會進到ACM-ICPC決賽的前幾名,真的是很恐怖。

第二本是日本國手寫的プログラミングコンテストチャレンジブック,台灣也有代理成翻譯書,叫做《培養與鍛鍊程式設計的邏輯腦:世界級程式設計大賽的知識、心得與解題分享》,也是跟劉汝佳寫得差不多,只是這本書是拿POJ跟GCJ的題目來講解。

6. 學海無涯

  以解題而言,初學者最容易犯的錯,以為只看書就懂什麼叫做資料結構或演算法,甚至只挑簡單題來做,這樣是永遠不會成長。以我個人而言,大學的資料結構與演算 法都是有寫程式作業,且佔總成績很重,不寫好就是等著被當掉,因此有很多時間花在學好資料結構與演算法的理論與程式設計。從大二開始就跟著學長姐進入解題 比賽這一條不歸路(?),起初真的如同前面提到,即使課程學過資料結構與演算法的基礎知識,卻還是不會轉換成解題的方法,意思就是解題寫太少,且又碰得太 簡單,才沒有進步。之後到了大三,大概也才解了一百多題Uva題目,但覺得學的還是少。直到轉學至長榮,突然有個發神經的動力,開始瘋狂解題,真正體會到 資料結構與演算法的實作能力與奧妙之處,短短一年多解了4百題,這趟過程雖然辛苦,但是卻非常值得!
  從以前去中山、成大的全國大專程式競 賽、南區程式競賽等比賽,常常看見很熟悉的成大選手臉孔,直到現在遇到的同一輩與新一代的強選手,這趟比賽過程值得回憶。最後今年的ITSA桂冠賽仍沒獲 獎,但也還是值得了,至少跟成大同解數還蠻高興(?)。而CPE(大學程式能力檢定)在上禮拜二拿下A+的成績,也是了無遺憾!
  希望這篇文章有能幫助到有共同志趣在解題上的人,更希望能帶動程式解題氣氛,解題只有好處沒壞處,也如演算法筆記所述,解題能學到以下這五種能力:
  一、智力思考:藉由智力測驗問題、益智遊戲(如數獨、孔明棋、倉庫番)、數學科普書等等,可以活絡大腦思路,培養觀察問題與分析問題的能力。
  二、數學:從學校教科書可以學到很多數學概念、數學方法、甚至是數學公式,套用在問題上面來解決問題。
  三、計算學:從學校教科書和網路上的資源,可以學到很多計算方法,套用在問題上面來解決問題。
  四、程式語言:從程式語言的書籍( C++ Primer 、 Effective C++ 、程式設計師的自我修養)、計算機概論等書中學習。
  五、程式設計:從 open source 與其他人寫的程式碼中學習一些寫程式的原則以及漂亮的寫法。
所以,解題Z>B是百分百正確的!

7. 疑問
  也有人會問,做解題那麼多對實際撰寫專題(系統)有用嗎?這要回答「部分有用」,畢竟一個系統就是要解決一大堆問題集合的工程方法,而解題只有解一部分小問 題。但是學過演算法會知道,要想辦法把問題切成子問題來解決,做系統也一樣,每一個系統可以切成各種功能的子系統,每一子系統是針對特定問題作解決的方 案。因此一個子系統的功能完整,正是一個(數個)程式的執行能力,而程式又如一位Niklaus Wirth大師所說:「程式 = 演算法+資料結構」。好得程式可以整合出一個好的系統,這是我個人對系統實作的觀念,所以解題學的好,仍然對做系統有幫 助。只是有些是解題學不到的,比如如何使用API來做完成一個子系統的功能,必須要有閱讀文件的能力,解題上沒有閱讀文件的學習方法。

-------- 2014/6/16補充---------
  這陣子接觸到2048 bot大賽,在這過程學到何謂對抗搜尋的branch-and-bound演算法,包含minimax、alpha-beta prune、expectimax、negascout等方法。目前ACM題目的解題我還沒遇到剪枝的題目,藉由這2048比賽的機會,學到了剪枝的精神!只是國內研究單位太強了,交大的居然能十幾%的16384 Tile....超好奇他們演算法能快狠準到此成績。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1. 澄清问题(clarification)

重复问题,把白板分成三部分,第一部分列出所有的条件:输入输出是什么(类型,pattern),数据大小等;第二部分用来做演算,第三部分用来写代码。

2. 开始在白板第二部分研究面试官给你的例子,为面试官分析问题,比如要解决这个问题,我们需要解决哪些子问题,然后看能否得到一个brute force的解,这里就是检查所有的pair,O(n^2)的复杂度。

3. 面试官肯定会叫你优化,这时你就要积极思考,同时说出你在想什么,比如可不可以不用检查pair,找每个数和target number的差值是否已经存在,这样只需要遍历一遍就行了呀,为了更快检查出来差值是否存在,可以用哈希表实现最好情况O(1)的查询速度。

4. 面试官表示他认可你,这个时候你要总结一下你的解题步骤1,2,3,然后在每一个步骤下,书写对应的代码,中间不需要说太多话,每一个block写之前交代一下,写完后总结一下就行,每完成一个要求,在白板第一部分对应的地方打钩。

5. 可以使用不同颜色的笔,标注不同的部分。

6. 写完以后,跑几个有代表性的test case,时空复杂度分析。

7. 整个过程中,注意好变量和函数的命名,少用全局变量,大的函数一定要拆分成若干子函数,分别负责不同的任务,这样代码可读性高,修改起来也非常方便,比如说面试官说你A函数里有个bug,你可以迅速定位到A函数的位置。大家可以搜索一些关于good coding practice的文章。

实际碰到的题目可能不会这么简单,你的思路可能会卡住,不要慌。面试官想要看到的就是你的思考过程,你需要做的就是告诉面试官你的方向,你卡住的地方在哪里,而不是自己闷头想。你这么做释放了一个积极的沟通信号,那么面试官自然也会给你积极的回应。

此外,如果面试官打断了你,问你what about doing something in this way....这很可能是一个提示告诉你的方法不对。请你一定,一定,一定按照面试官说的做!即便你觉得你的方法马上就要做出来了。要知道算法题就好比走迷宫,你用你的方法发现出口好像就在眼前,这个时候,面试官提醒你尝试另一种方案,而你需要往回走很多步。很多人这个时候根本就听不进面试官的话,觉得自己的方法肯定行,殊不知面试官知道整个迷宫是什么样的,而你看似正确的那条路,很可能最终是一条死路。如果你一意孤行,你的feedback绝对是不好的。