Cracking the Coding Interview
牛肉干的技术笔记
一个人在年少的时候,可能无法看到自己现在做的事情跟自己未来会有什么关联。您无法预知未来,只能回顾。但是您需要有信心,当您很多年后回头看时,这些点点滴滴会连接在一起,让您朝自己的理想迈进。
展开
-
7.清除行列
请编写一个算法,若N阶方阵中某个元素为0,则将其所在的行与列清零。给定一个N阶方阵int[][](C++中为vector<vector><int>>)mat和矩阵的阶数n,请返回完成操作后的int[][]方阵(C++中为vector<vector><int>>),保证n小于等于300,矩阵中的元素为int范围内。</int>...原创 2019-06-12 22:05:48 · 161 阅读 · 0 评论 -
11.链表分割
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前给定一个链表的头指针 ListNode*pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。 public ListNode partition(ListNode pHead, int x) { // write code here ...原创 2019-06-16 19:00:16 · 97 阅读 · 0 评论 -
6.像素翻转
题目描述有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于500,图像元素小于等于256。测试样例:[[1,2,3],[4,5,6],[7,8,9]],3返回:[[7,4,1],[8,5,2],[9...原创 2019-06-11 19:58:24 · 163 阅读 · 0 评论 -
14.集合栈
题目描述请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈。该数据结构应支持与普通栈相同的push和pop操作。给定一个操作序列int[][2]ope(C++为vector<vector<int>>),每个操作的第一个数代表操作类型,若为1,则为push操作,后一个数为应push的数字;若为...原创 2019-06-25 18:31:23 · 140 阅读 · 0 评论 -
15.两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>()...原创 2019-06-25 18:33:59 · 82 阅读 · 0 评论 -
16.双栈排序
题目描述请编写一个程序,按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。给定一个int[]numbers(C++中为vector<int>),其中第一个元素为栈顶,请返回排序后的栈。请注意这是一个栈,意味着排序过程中你只能访问到最后一个元素。测试样例:[1,2,3,4,5]返回:[5,...原创 2019-07-02 20:24:58 · 129 阅读 · 0 评论 -
20.高度最小的BST
题目描述对于一个元素各不相同且按升序排列的有序序列,请编写一个算法,创建一棵高度最小的二叉查找树。给定一个有序序列int[]vals,请返回创建的二叉查找树的高度。模拟递归建树的过程计算高度 即可import java.util.Arrays;public class MinimalBST { public int buildMinimalBST(int[] ...原创 2019-08-02 21:08:26 · 144 阅读 · 0 评论 -
17.猫狗收容所
题目描述 有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。 给定一个操作序列int[][2]ope(C++中为vector<vector<int>>)代表所有事件。若第一个元素为1,则代表有动物进入收容...原创 2019-07-30 20:41:23 · 142 阅读 · 0 评论 -
18.二叉树平衡检查
题目描述实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1。给定指向树根结点的指针TreeNode*root,请返回一个bool,代表这棵树是否平衡。关于树的基本就是递归了public class Balance { public boolean isBalance(TreeNode root) { ...原创 2019-08-01 19:39:09 · 124 阅读 · 0 评论 -
10.访问单个节点的删除
实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点。给定待删除的节点,请执行删除操作,若该节点为尾节点,返回false,否则返回true public class ListNode { int val; ListNode next = null; ListNode(int val) { th...原创 2019-06-16 17:00:40 · 111 阅读 · 0 评论 -
5.基本字符串压缩
利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。给定一个string iniString为待压缩的串(长度小于等于10000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。做这道题的时候,首先想了下自己new ...原创 2019-06-10 20:22:14 · 200 阅读 · 0 评论 -
1.确定字符互异
请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。给定一个stringiniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。首先,不看条件不允许使用额外的数据结构的话,我最先想到的就是使用hashmap,遍历一遍,存储每个字符一...原创 2019-06-07 10:21:52 · 157 阅读 · 0 评论 -
2.原串反转
请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。给定一个stringiniString,请返回一个string,为翻转后的字符串。保证字符串的长度小于等于5000。题目说 不能使用额外的数据结构和存储空间,则不能使用java,因为java String是不可变的,只能通过新开辟空间来操作。如果不考虑这些 用java的话 ...原创 2019-06-07 11:04:38 · 168 阅读 · 0 评论 -
8.翻转子串
题目描述假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。给定两个字符串s1,s2,请返回bool值代表s2是否由s1旋转而成。字符串中字符为英文字母和空格,区分大小写,字符串长度小于等于1000。测试样例:"Hello world","wo...原创 2019-06-13 21:05:08 · 194 阅读 · 0 评论 -
3.确定两串乱序同构
给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。这里规定大小写为不同字符,且考虑字符串中的空格。给定一个stringstringA和一个stringstringB,请返回一个bool,代表两串是否重新排列后可相同。保证两串的长度都小于等于5000。看完题目后,第一想法就是就是和前两道题目有点像,用散列可以很好的解决问题。将两个字符串分别散列到...原创 2019-06-08 15:19:50 · 183 阅读 · 0 评论 -
4.空格替换
请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。给定一个stringiniString为原始的串,以及串的长度 intlen, 返回替换后的string。如果不考虑空间问题,直接遍历一遍,将原有字符串复制到新的字符串那种即可,时间复杂度为o(n),空...原创 2019-06-09 11:08:38 · 110 阅读 · 0 评论 -
12.链式A+B
有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。给定两个链表ListNode*A,ListNode*B,请返回A+B的结果(ListNode*)。时间复杂度o(n) public class ListNode { int val; ListNo...原创 2019-06-19 22:20:00 · 103 阅读 · 0 评论 -
13.回文链表
题目描述请编写一个函数,检查链表是否为回文。给定一个链表ListNode*pHead,请返回一个bool,代表链表是否为回文。测试样例:{1,2,3,2,1}返回:true{1,2,3,2,3}返回:false翻转比较先遍历一遍翻转存到新的链表中,再遍历一遍比较即可 时间复杂度o(n),空间复杂度o(n) public boolea...原创 2019-06-19 22:59:43 · 85 阅读 · 0 评论 -
9.链表中倒数第K个节点
输入一个链表,输出该链表中倒数第k个结点。一种直接的方法是,遍历两次链表可以解决,但是肯定不是最佳方法。第二种可以使用两个指针,让两个指针相距k个节点,使两个指针同步移动,当右指针到链表尾节点时,左指针正好指向第k个节点。时间复杂度o(n) public class ListNode { int val; ListNode next = n...原创 2019-06-15 19:38:43 · 102 阅读 · 0 评论 -
19.有向路径检查
题目描述对于一个有向图,请实现一个算法,找出两点之间是否存在一条路径。给定图中的两个结点的指针DirectedGraphNode*a, DirectedGraphNode*b(请不要在意数据类型,图是有向图),请返回一个bool,代表两点之间是否存在一条路径(a到b或b到a)。遍历邻接矩阵 递归public class Path { public boolean...原创 2019-08-01 19:59:16 · 102 阅读 · 0 评论