Cracking the coding interview 第一章问题及解答 不管是不是要挪地方,面试题具有很好的联系代码总用,参加新工作的半年里,做的大多是探索性的工作,反而代码写得少了,不高兴,最近开始重新捡起面试题,来练练手,让自己保持代码的感觉. 代码主要是c的,可以避免使用容器之类的封装.因为使用c的话更能触及细节,而这也正是面试题所要考察的.同时,尽量为每道题添加了单元测试的用例. 代码是在windows下编辑运行的,只能保证在windows下正常运行,因为windows下的c编译器…
<Cracking the Coding Interview>是适合硅谷技术面试的一本面试指南,因为题目分类清晰,风格比较靠谱,所以广受推崇. 以下是我的读书笔记,基本都是每章的课后习题解答,其中不包括第15章. 相关源码在此repo中可以找到:https://github.com/zhuli19901106/Cracking-the-Coding-Interview <Cracking the Coding Interview>——第18章:难题——题目13 <Cracki…
写在开头 最近忙于论文的开题等工作,还有阿里的实习笔试,被虐的还行,说还行是因为自己的水平或者说是自己准备的还没有达到他们所需要人才的水平,所以就想找一本面试的书<Cracking the coding interview>,来练练手,顺带复习一下自己的基础知识,一些常用的数据结构,偶然在某位大神的blog里看到其分享的文章,还有他所做的解答,感觉自己的解答远没有他的简洁,且其解题都会优先考虑其空间和时间复杂度.本系列的文章只介绍,我做题过程中,遇到的一些好的思想方法,当然我会贴出一些代码.在…
前言 <Cracking the coding interview>是一本被许多人极力推荐的程序员面试书籍, 详情可见:http://www.careercup.com/book. 第六版中文版里面有189道程序员面试题目及相应的解答. 书中大部分是编程题目, 并且配有相应的java程序. 我把书中的题目做了一遍, 并且记录下来,包含自己对问题的一些思路及看法,许多问题给出了两种以上的解答方案. 由于个人在学习Go语言,所以程序是用Go 1.13编写,所有的代码都托管在Github上: htt…
Cracking the Coding Interview(Trees and Graphs) 树和图的训练平时相对很少,还是要加强训练一些树和图的基础算法.自己对树节点的设计应该不是很合理,多多少少会有一些问题,需要找一本数据结构的书恶补一下如何更加合理的设计节点. ? class TreeNode { public:     int treenum;       TreeNode** children;     int child_num;     int child_len;     in…
Cracking the Coding Interview(Stacks and Queues) 1.Describe how you could use a single array to implement three stacks. 我的思路:一般堆栈的实现会利用一个数组,这里一个数组若实现3个堆栈,直接考虑把数组划分为3个部分,相当于3个独立的数组,所以就有以下的实现. 但是,这种实现方式的缺点在于均分了每个stack需要的space,但是事先无法确定每个stack是否需要更多的spac…
2014-04-24 00:05 题目:用拉链法设计一个哈希表. 解法:一个简单的哈希表,就看成一个数组就好了,每个元素是一个桶,用来放入元素.当有多个元素落入同一个桶的时候,就用链表把它们连起来.由元素值到哈希值的映射就是哈希函数了. 代码: // 8.10 Design a hash table. Handle conflicts with chaining(linked lists). #include <iostream> #include <string> #includ…
2014-04-23 23:57 题目:如何设计一个内存文件系统,如果可以的话,附上一些代码示例. 解法:很遗憾,对我来说不可以.完全没有相关经验,所以实在无从入手.这题目应该和工作经验相关吧? 代码: // 8.9 How would you design an in-memory file system. // I wouldn't possibly do that without the help of google...quite a lot of specifications and…
2014-04-23 23:49 题目:有个棋牌游戏叫Othello,也叫Reversi.请看游戏规则.中文应该叫黑白棋吧,不常玩儿就是了. 解法:既然这题的规则很清楚,也很清楚,我就写了一个命令行的程序来模拟玩游戏的过程. 代码: // 8.8 Othello game, the rule is balabala. Try to design a class to play the game. // Here are the rules: // 1. two players, one blac…
2014-04-23 23:38 题目:你要如何设计一个聊天服务器,有什么技术难点? 解法:这是基于工作经验的面试题吗?否则,一个new grad碰上这种题目能打点草稿也就算不错了. 代码: // 8.7 Tell me what you would do if told to design the backend for a online chatting system. // Designing a chatting server, it will at least provide: //…
2014-04-23 22:57 题目:实现一个数据结构来表示拼图游戏中的碎片. 解法:一个拼图块儿有四条边,每边只有凹凸平三种情况,当两块碎片拼接的时候,分为四个方向进行,块儿上的图案肯定也是判断是否能拼接的依据之一.所以就有了以下的表示方法,又一题做得云里雾里.话说这种题目在面试时如果真遇到,得写到什么程度的代码才算及格? 代码: // 8.6 Design data structure to represent pieces in jigsaw puzzle. If possible pl…
2014-04-23 18:42 题目:设计一个在线阅读系统的数据结构. 解法:这题目太大了,我的个亲娘.显然你不可能一次加载一整本书,做到单页纸加载的粒度是很必要的.为了读书的连贯效果,预取个几页也很必要. 代码: // 8.5 Deign a class for an online book reader system. #include <unordered_map> using namespace std; class BookReaderSystem { public: BookRe…
2014-04-23 18:17 题目:设计一个停车位的类. 解法:停车位,就要有停车.取车的功能了.另外我还加了一个工作线程用于计费,每秒给那些有车的车位加1块钱费用. 代码: // 8.4 Design a class to simulate the parking lot. #include <iostream> #include <string> #include <thread> #include <vector> using namespace…
2014-04-23 18:10 题目:设计一个点唱机. 解法:英文叫Musical Jukebox.这是点唱机么?卡拉OK么?这种题目实在是云里雾里,又没有交流的余地,我索性用一个vector来表示一首曲子吧.不过有一点是肯定的,点播行为和播放行为应该分不同线程操作,这样就不至于让机器一直卡在那儿等你点歌了. 代码: // 8.3 Design a data structure to simulate a musical jukebox. #include <iostream> #inclu…
2014-04-23 17:45 题目:假设有个呼叫中心,有接线员.经理.主管三种角色.如果接线员无法处理呼叫,就上传给经理:如果仍无法处理,则上传给主管.请用代码描述这一过程. 解法:第一眼觉得这题肯定是在考察设计模式,很像exception的throw过程.对于我这种对设计模式一窍不通的人,这题还无法很好解答.待稍后专门学习设计模式之后,再回来好好琢磨一遍. 代码: // 8.2 Design a call center system to handle calls, the order w…
2014-04-23 17:32 题目:请设计一个数据结构来模拟一副牌,你要如何用这副牌玩21点呢? 解法:说实话,扑克牌的花样在于各种花色.顺子.连对.三带一.炸弹等等,如果能设计一个数据结构,让判断这些特征的代码变得很好写,那就能满足题意要求了.我只是勉强实现了几个基本功能,包括抽牌.洗牌.切牌,用的是单向链表.至于要拿这个打斗地主.黑桃五之类的还是算了吧. 代码: // 8.1 Implement a class to simulate a deck of cards #include <…
文章的缘由可以参考此篇文章.目前完成了第二章,代码放在github上,地址在此.问题的描述都在对应的代码文件中.其他的章节仍在在进行中. 如果代码有问题,欢迎指正,谢谢. yetuweiba…
第一章:数组与字符串 1 数组与字符串 请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符.保证字符串中的字符为ASCII字符.字符串的长度小于等于3000. 测试样例: "aeiou" 返回:True "BarackObama" 返回:False 思路:(1) 两个for循环,比较后面的是否相同 O(…
2014-04-29 04:40 题目:给定一个字母组成的矩阵,和一个包含一堆单词的词典.请从矩阵中找出一个最大的子矩阵,使得从左到右每一行,从上到下每一列组成的单词都包含在词典中. 解法:O(n^3)级别的时间和空间进行动态规划.这道题目和第17章的最后一题很像,由于这题的时间复杂度实在是高,我动手写了字典树进行加速.如果单纯用哈希表来作为词典,查询效率实际会达到O(n)级别,导致最终的算法复杂度为O(n^4).用字典树则可以加速到O(n^3),因为对于一个字符串“abcd”,只需要从字典树的…
2014-04-25 20:07 题目:为什么基类的析构函数必须声明为虚函数? 解法:不是必须,而是应该,这是种规范.对于基类中执行的一些动态资源分配,如果基类的析构函数不是虚函数,那么 派生类的析构函数在自动调用的时候,不会调用基类的析构函数,这样就会造成资源未释放引起的内存泄漏. 代码: // 13.6 If a class is defined as base class, why must its destructor be declared "virtual"? // Ans…
2014-03-19 06:27 题目:有一个数组里包含了0~n中除了某个整数m之外的所有整数,你要设法找出这个m.限制条件为每次你只能用O(1)的时间访问第i个元素的第j位二进制位. 解法:0~n的求和有公式可循,只要把所有数都加起来就能知道缺少的m是几了.书本提供了一种比较高效的解法,我仔细读了以后觉得书上给的优化算法实际上需要额外的空间来支持,coding难度偏高,临场的话我估计挺难写出来的. 代码: // 5.7 Find the missing integer from 0 to n,…
2.2 链表中倒数第k个结点 输入一个链表,输出该链表中倒数第k个结点. 思路:快慢指针(error: 判断是否有可行解,否则返回null, while, if 后加空格) /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode FindKthToTail(ListNode…
2014-04-29 04:36 题目:最大子数组和的二位扩展:最大子矩阵和. 解法:一个维度上进行枚举,复杂度O(n^2):另一个维度执行最大子数组和算法,复杂度O(n).总体时间复杂度为O(n^3),还需要O(n)额外空间. 代码: // 18.12 Given an n x n matrix, find the submatrix with largest sum. Return the sum as the result. #include <algorithm> #include &…
2014-04-29 04:30 题目:给定一个由‘0’或者‘1’构成的二维数组,找出一个四条边全部由‘1’构成的正方形(矩形中间可以有‘0’),使得矩形面积最大. 解法:用动态规划思想,记录二维数组每个元素向上下左右四个方向各有多少个连续的‘1’,然后用O(n^3)时间计算出满足条件的最大正方形.时间复杂度O(n^3),空间复杂度O(n^2). 代码: // 18.11 Given an NxN matrix of 0s and 1s, find out a subsquare whose a…
2014-04-29 04:22 题目:给定一堆长度都相等的单词,和起点.终点两个单词,请从这堆单词中寻找一条变换路径,把起点词变成终点词,要求每次变换只能改一个字母. 解法:Leetcode中有Word Ladder,这题基本思路一致. 代码: // 18.10 Given a list of words, all of same length. Given a source and a destionation words, you have to check if there exists…
2014-04-29 04:18 题目:有一连串的数被读入,设计一个数据结构,能随时返回当前所有数的中位数. 解法:用一个大顶堆,一个小顶堆将数分成数量最接近的两份,就能轻松得到中位数了. 代码: // 18.9 A stream of integers are passed to you, you have to tell me the median as they keep coming in. #include <climits> #include <iostream> #i…
2014-04-29 03:10 题目:给定一个长字符串S和一个词典T,进行多模式匹配,统计S中T单词出现的总个数. 解法:这是要考察面试者能不能写个AC自动机吗?对面试题来说太难了吧?我不会,所以只写了个KMP用N次的方法. 代码: // 18.8 Given a list of words and a piece of text, find out how many times in total, all words appear in the text. #include <iostrea…
2014-04-29 03:05 题目:给定一个词典,其中某些词可能能够通过词典里其他的词拼接而成.找出这样的组合词里最长的一个. 解法:Leetcode上有Word Break这道题,和这题基本思路一致. 代码: // 18.7 Given a list of words, find out the longest word made of other words in the list. #include <iostream> #include <string> #includ…
2014-04-29 02:27 题目:找出10亿个数中最小的100万个数,假设内存可以装得下. 解法1:内存可以装得下?可以用快速选择算法得到无序的结果.时间复杂度总体是O(n)级别,但是常系数不小. 代码: // 18.6 Find the smallest one million number among one billion numbers. // Suppose one billion numbers can fit in memory. // I'll use quick sele…
2014-04-29 01:51 题目:你有一个文本文件,每行一个单词.给定两个单词,请找出这两个单词在文件中出现的其中一对位置,使得这两个位置的距离最短. 解法:我的思路是建立倒排索引,计算出所有单词出现的所有位置.下面代码只给出了两个索引的处理方法.倒排索引一般以链表的形式出现,通过顺序扫描两个链表,类似归并排序算法中的merge过程,就能够找出最短距离.请看代码. 代码: // 18.5 Given a text file containing words, find the shorte…