
《程序员面试金典》例题解析
文章平均质量分 57
zdplife
千里之行始于足下,一步一个脚印,终会成功
展开
-
《程序员面试金典》--求集合栈
题目描述:请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈。该数据结构应支持与普通栈相同的push和pop操作。给定一个操作序列int[][2] ope(C++为vector>),每个操作的第一个数代表操作类型,若为1,则为push操作,后一个数为应push的数字;若为2,则为pop操作,后一个数无意义。请返回一个int[原创 2015-10-03 13:37:11 · 677 阅读 · 0 评论 -
《程序员面试金典》--平衡二叉树的检测
题目描述: 实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1。给定指向树根结点的指针TreeNode* root,请返回一个bool,代表这棵树是否平衡。题目分析:: 平衡二叉树是通过左右子树的高度来判断是否为平衡二叉树的,所以我们首先想到的是如何求一个树的高度,求一个树的高度很简单,递归求解,每次求出左右子原创 2015-10-06 11:25:13 · 1334 阅读 · 0 评论 -
《程序员面试金典》--输出二叉树中某一层的所有元素
题目描述:struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};struct ListNode { int val;原创 2015-10-23 16:23:56 · 2881 阅读 · 0 评论 -
《程序员面试金典》--删除链表中的某个元素(这个元素只能访问)
题目描述:实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点。给定带删除的节点,请执行删除操作,若该节点为尾节点,返回false,否则返回true题目分析:对于一个单向链表,如果给出其中一个节点的情况下,想把这个节点删除,删除该节点以后,还希望链表完整的,这个时候我们无法获取当前节点前面一个节点,只能获取其后面一个节点,如果把当前节点删除掉,那么就无法让链表完整,这原创 2015-09-17 15:52:11 · 728 阅读 · 0 评论 -
《程序员面试金典》--找出链表中倒数第k个节点
题目描述: 给定一个单向链表的头结点,找出链表中倒数第k个节点方法1(求长度):可以首先遍历链表,求出链表的长度L,再继续从头节点开始遍历一次链表,走到L-K的位置便是所求的节点。这样就要遍历两次链表O(2N);方法2(递归实现):递归遍历链表,当达到链表末尾时候,传递一个值为0的计数器,之后每次调用将该计数器加1,当计数器等于k时,便将该节点返回,只需要遍历一次链表,原创 2015-09-16 17:59:38 · 775 阅读 · 0 评论 -
《程序员面试金典》--二叉查找树的判断
/************************************************************************************************************题目描述:请实现一个函数,检查一棵二叉树是否为二叉查找树。给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树。*******原创 2015-10-24 14:55:13 · 1175 阅读 · 0 评论 -
《程序员面试金典》--寻找二叉树中某个节点中序遍历的下一个节点
/*************************************************************************************************************题目描述:请设计一个算法,寻找二叉树中指定结点的下一个结点(即中序遍历的后继)。给定树的根结点指针TreeNode* root和结点的值int p,请返回值为p的结点的后继原创 2015-10-25 14:12:10 · 1870 阅读 · 0 评论 -
《程序员面试金典》--分割链表
题目描述:编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前,给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。题目分析:要是链表换作数组要特别小心,因为搬迁数组要涉及到移动元素的开销,而移动链表的元素则容易很多,我们不需要移动和交换链表中的元素,只是改变一下每个节点的n原创 2015-09-21 20:37:05 · 1332 阅读 · 2 评论 -
《程序员面试金典》--寻找二叉树中两个节点的第一个公共祖先(三种情况)
/****************************************************************************************************************题目描述:给定一颗二叉树,以及二叉树中的两个节点,找出这两个节点的第一个公共祖先节点。**************************************原创 2015-10-26 19:21:33 · 3136 阅读 · 0 评论 -
《程序员面试金典》--链表相加
题目描述1: 有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。 给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)。测试样例: {1,2,3},{3,2,1}返回: {4,4,4}题目分原创 2015-09-23 20:09:49 · 1316 阅读 · 0 评论 -
《程序员面试金典》--判断链表是否为回文链表
题目描述:请编写一个函数,检查链表是否为回文。给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文。测试样例:{1,2,3,2,1}返回:true测试样例:{1,2,3,2,3}返回:false题目分析:《方法1》:反转链表 可以将原始链表反转,判断反转以后的链表与原始链表是否完全一致,如果一致便返回true,如果不一致则返原创 2015-09-24 19:36:33 · 1715 阅读 · 0 评论 -
《程序员面试金典》--图中有向路径的检查
题目描述: 对于一个有向图,请实现一个算法,找出两点之间是否存在一条路径。给定图中的两个结点的指针UndirectedGraphNode* a,UndirectedGraphNode* b(请不要在意数据类型,图是有向图),请返回一个bool,代表两点之间是否存在一条路径(a到b或b到a)。题目分析: 这个题目考察的其实是有向图的遍历,图的遍历分为深度优原创 2015-10-21 11:12:06 · 1477 阅读 · 0 评论 -
《程序员面试金典》--基本字符串压缩
题目描述:利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。给定一个string iniString为待压缩的串(长度小于等于3000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。测试样例:"aabccccc原创 2015-09-11 16:56:30 · 950 阅读 · 0 评论 -
《程序员面试金典》--反转字符串
题目描述:请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量),给定一个string iniString,请返回一个string,为翻转后的字符串。保证字符串的长度小于等于5000。测试样例:"This is nowcoder"返回:"redocwon si sihT"题目分析: 这道题目难度不是很大,首先可能会想到,重现建原创 2015-09-09 15:04:29 · 1272 阅读 · 0 评论 -
《程序员面试金典》--确定所有字符是否互异
题目描述:请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。给定一个stringiniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。思路一:(时间复杂度为O(N*N)) 看到这道题目第一想法就是将每个字符与其他字符进原创 2015-09-08 17:22:48 · 2303 阅读 · 4 评论 -
《程序员面试金典》--狗猫收容所
题目描述: 有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。给定一个操作序列int[][2] ope(C++中为vector>)代表所有事件。若第一个元素为1,则代表有动物进入收容所,第二个元素为动物的编号,整数代表狗,负数代表猫;若第一个元素为2,则代原创 2015-10-05 16:47:53 · 1259 阅读 · 0 评论 -
《程序员面试金典》--判断反转字符串
题目描述:假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。给定两个字符串s1,s2,请返回bool值代表s2是否由s1旋转而成。字符串中字符为英文字母和空格,区分大小写,字符串长度小于等于1000。测试样例:"Hello world","原创 2015-09-15 20:16:51 · 1348 阅读 · 0 评论 -
《程序员面试金典》--清除二维数组中元素为0所在的行和列
题目描述:请编写一个算法,若MxN矩阵中某个元素为0,则将其所在的行与列清零。给定一个MxN的int[][]矩阵(C++中vector>)mat和矩阵的阶数n,请返回完成操作后的int[][]矩阵(C++中为vector),保证n小于等于300,矩阵中的元素为int范围内。测试样例:[[1,2,3],[0,1,2],[0,0,1]]返回:[[0,0,3],[0,0,0],[原创 2015-09-15 19:17:55 · 1769 阅读 · 1 评论 -
《程序员面试金典》--像素反转
题目描述: 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。 给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于500,图像元素小于等于256。测试样例:[[1,2,3],[4,5,6],[7,8,9]],3返回:[[7,4,1],[8,5,原创 2015-09-11 19:20:42 · 742 阅读 · 0 评论 -
《程序员面试金典》--空格替换
题目描述: 请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。给定一个string iniString 为原始的串,以及串的长度 int len, 返回替换后的string。测试样例: "Mr John Smith”,13 返回:"Mr%原创 2015-09-10 21:50:06 · 706 阅读 · 0 评论 -
《程序员面试金典》--确定两串乱序同构
题目描述:给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。这里规定大小写为不同字符,且考虑字符串重点空格。给定一个string stringA和一个string stringB,请返回一个bool,代表两串是否重新排列后可相同。保证两串的长度都小于等于5000。测试样例:"This is nowcoder","is This nowcoder"原创 2015-09-09 15:30:44 · 1161 阅读 · 2 评论