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-29 04:40 题目:给定一个字母组成的矩阵,和一个包含一堆单词的词典.请从矩阵中找出一个最大的子矩阵,使得从左到右每一行,从上到下每一列组成的单词都包含在词典中. 解法:O(n^3)级别的时间和空间进行动态规划.这道题目和第17章的最后一题很像,由于这题的时间复杂度实在是高,我动手写了字典树进行加速.如果单纯用哈希表来作为词典,查询效率实际会达到O(n)级别,导致最终的算法复杂度为O(n^4).用字典树则可以加速到O(n^3),因为对于一个字符串“abcd”,只需要从字典树的…
第18章---高度难题 1,-------另类加法.实现加法. 另类加法 参与人数:327时间限制:3秒空间限制:32768K 算法知识视频讲解 题目描述 请编写一个函数,将两个数字相加.不得使用+或其他算数运算符. 给定两个int A和B.请返回A+B的值 测试样例: 1,2 返回:3 答案和思路:xor是相加不进位.and得到每一个地方的进位.所以,用and<<1之后去与xor异或.不断递归. import java.util.*; public class UnusualAdd { pu…
2014-04-29 00:20 题目:给定一个长字符串,和一个词典.如果允许你将长串分割成若干个片段,可能会存在某些片段在词典里查不到,有些则查得到.请设计算法进行分词,使得查不到的片段个数最少. 解法:用空间换取时间的动态规划算法,首先用O(n^2)的时间判断每一个片段是否在字典里.这个过程其实可以通过字典树来进行加速,时间上能优化一个阶,不过我没写,偷懒用<unordered_set>代表了字典.之后通过O(n)时间的动态规划,dp[i]表示当前位置的查不到的片段的最少个数.对于懂代码的…
2014-04-29 00:15 题目:将二叉搜索树展开成一个双向链表,要求这个链表仍是有序的,而且不能另外分配对象,就地完成. 解法:Leetcode上也有,递归解法. 代码: // 17.13 Flatten a binary search tree into a doubly linked list by inorder traversal order. // Use postorder traversal to do the flattening job. #include <cstdi…
2014-04-29 00:04 题目:给定一个整数数组,找出所有加起来为指定和的数对. 解法1:可以用哈希表保存数组元素,做到O(n)时间的算法. 代码: // 17.12 Given an array of integers and target value, find all pairs in the array that sum up to the target. // Use hash to achieve O(n) time complexity. Duplicates pairs…
2014-04-29 00:00 题目:给定一个rand5()函数,能够返回0~4间的随机整数.要求实现rand7(),返回0~6之间的随机整数.该函数产生随机数必须概率相等. 解法:自己想了半天没想出等概率的方法,最后参考答案了.答案思想实在巧妙:随机0~24间的数,然后把21~24丢弃,剩余的0~20对7取模就是等概率随机数了. 代码: // 17.11 Given a rand5() method, which generates random integer between [0, 4]…
2014-04-28 23:54 题目:XML文件的冗余度很大,主要在于尖括号里的字段名.按照书上给定的方式进行压缩. 解法:这题我居然忘做了,只写了一句话的注解.用python能够相对方便地实现,因为有直接的XML工具可以调用.书上的那种要求应该是符合前序遍历规则. 代码: # 17.10 Parse an XML file, and try to save some space by mapping every item name to an integer index. # Answer:…
2014-04-28 23:52 题目:设计算法,找出一本书中某个单词的出现频率. 解法:数就行了. 代码: // 17.9 Given a book, find out the occurrences of any given words in it. // Answer: // 1. process the book as a text file. // 2. find all words, definition of a word must be clearly asserted. //…
2014-04-28 23:35 题目:最大子数组和问题. 解法:O(n)解法. 代码: // 17.8 Find the consecutive subarray with maximum sum in an array. // O(n) online algorithm. #include <cstdio> #include <vector> using namespace std; int maximumSum(vector<int> &v) { int…
2014-04-28 23:28 题目:给定一个数字,用英语把它读出来. 解法:ZOJ上有相反的题目.如果我要用中文读书来呢? 代码: // 17.7 Read an integer in English. #include <map> #include <string> using namespace std; map<int, string> m; void init() { m[] = "zero"; m[] = "one"…
2014-04-28 22:49 题目:给定一个整数数组.如果你将其中一个子数组排序,那么整个数组都变得有序.找出所有这样子数组里最短的一个. 解法:线性时间,常数空间内可以解决,思想类似于动态规划.通过正反扫描两次,可以得出这个区间的两端.只要存在i < j并且a[i] > a[j],那么这个区间[i, j]就必须被排序,为了在线性时间内完成算法,我们可以通过不断比较当前元素与当前最大(最小)元素来更新结果.请看代码. 代码: // 17.6 Given an array, if you s…
2014-04-28 22:44 题目:猜数字游戏.四个数字,每个都是0~9之间.你每猜一次,我都告诉你,有多少个位置和数字都对(全对),有多少个位置错数字对(半对).比如“6309”,你猜“3701”,就有1全对,1半对. 解法:依照题意写就可以了. 代码: // 17.5 I am the Master Mind. Guess the number. // When you guessed the right number at the right position, you got a h…
2014-04-28 22:32 题目:不用if语句或者比较运算符的情况下,实现max函数,返回两个数中更大的一个. 解法:每当碰见这种无聊的“不用XXX,给我XXX”型的题目,我都默认处理的是int类型.最高位是符号位,用x - y的符号位来判断谁大谁小.请看下面代码,条件表达式配合异或运算能满足题目的要求. 代码: // 17.4 Find the maximum of two numbers without using comparison operator or if-else stat…
2014-04-28 22:18 题目:计算N的阶乘尾巴上有多少个零? 解法:计算5的个数即可,因为2 * 5 = 10,2的个数肯定比5多.计算5的个数可以在对数时间内搞定. 代码: // 17.3 Count how many zeros are there in n!? // Count the number of 5s in n!. #include <cstdio> using namespace std; int countZero(int n) { ; ) { res += n…
2014-04-28 22:05 题目:写个程序判断三连棋哪一方赢了. 解法:三个相同的棋子连成一条横线,竖线或者对角线就判断为赢了. 代码: // 17.2 Write an algorithm to check if someone has won the tic-tac-toe game. // Here is the game: // xo- // ox- // --x // 'x' won the game. // Rule: anyone who gets three consecu…
2014-04-28 21:45 题目:就地交换两个数,不使用额外的变量. 解法:没说是整数,我姑且先当整数处理吧.就地交换可以用加法.乘法.异或完成,其中乘法和加法都存在溢出问题.三种方法都不能处理交换同一个数的情况,需要条件判断. 代码: // 17.1 Do a swapping in-place. #include <cstdio> using namespace std; void swap1(int &x, int &y) { if (x == y) { retur…
文章的缘由可以参考此篇文章.目前完成了第二章,代码放在github上,地址在此.问题的描述都在对应的代码文件中.其他的章节仍在在进行中. 如果代码有问题,欢迎指正,谢谢. yetuweiba…
第一章:数组与字符串 1 数组与字符串 请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符.保证字符串中的字符为ASCII字符.字符串的长度小于等于3000. 测试样例: "aeiou" 返回:True "BarackObama" 返回:False 思路:(1) 两个for循环,比较后面的是否相同 O(…
2014-04-25 20:07 题目:为什么基类的析构函数必须声明为虚函数? 解法:不是必须,而是应该,这是种规范.对于基类中执行的一些动态资源分配,如果基类的析构函数不是虚函数,那么 派生类的析构函数在自动调用的时候,不会调用基类的析构函数,这样就会造成资源未释放引起的内存泄漏. 代码: // 13.6 If a class is defined as base class, why must its destructor be declared "virtual"? // Ans…
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 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 <…
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,…
2014-03-18 05:17 题目:设计一个栈,这个栈实际上由一列子栈组成.每当一个子栈的大小达到n,就新产生下一个子栈.整个栈群对外看起来就像普通栈一样,支持取顶top().压入push().弹出pop()操作.另外再实现一个弹出特定子栈popAt()的操作. 解法:用stack构成的数组,可以实现快速的随机访问.用stack构成的链表实现,可以防止在中间的一些子栈进行pop操作造成的空隙,但顺序访问的效率要低一些.得根据执行这些操作的偏好和频率来定. 代码: // 3.3 Impleme…