程序员面试金典
你能不能别说话
这个作者很懒,什么都没留下…
展开
-
金典——叠罗汉2
题目描述叠罗汉是一个著名的游戏,游戏中一个人要站在另一个人的肩膀上。为了使叠成的罗汉更稳固,我们应该让上面的人比下面的人更轻一点。现在一个马戏团要表演这个节目,为了视觉效果,我们还要求下面的人的身高比上面的人高。请编写一个算法,计算最多能叠多少人,注意这里所有演员都同时出现。给定一个二维int的数组actors,每个元素有两个值,分别代表一个演员的身高和体重。同时给定演员总数n原创 2017-06-25 14:57:14 · 466 阅读 · 0 评论 -
程序员面试金典——最大连续数列和___
题目描述对于一个有正有负的整数数组,请找出总和最大的连续数列。给定一个int数组A和数组大小n,请返回最大的连续数列的和。保证n的大小小于等于3000。测试样例:[1,2,3,-6,1]返回:6思路:动态规划法 时间复杂度:O(N) 终于到了动态规划的部分了,这么一步一步原创 2017-05-27 17:26:41 · 304 阅读 · 0 评论 -
程序员面试金典——链式A+B
题目描述有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)。测试样例:{1,2,3},{3,2,1}返回:{4,4,4}依次从a,b处开始累加,每次加的结果有进位放原创 2017-05-27 17:30:24 · 230 阅读 · 0 评论 -
程序员面试金典——链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。代码思路如下:两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点。然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了。。倒数第k个结点,就是正数第n-k个结点。first先走到第k个结点处,那么剩下的就是n-原创 2017-05-27 20:23:34 · 283 阅读 · 0 评论 -
程序员面试金典——堆箱子____
题目描述有一堆箱子,每个箱子宽为wi,长为di,高为hi,现在需要将箱子都堆起来,而且为了使堆起来的箱子不到,上面的箱子的宽度和长度必须小于下面的箱子。请实现一个方法,求出能堆出的最高的高度,这里的高度即堆起来的所有箱子的高度之和。给定三个int数组w,l,h,分别表示每个箱子宽、长和高,同时给定箱子的数目n。请返回能堆成的最高的高度。保证n小于等于500。测试样例:[原创 2017-05-28 13:55:28 · 815 阅读 · 0 评论 -
程序员面试金典——二进制小数_(位运算)
题目描述有一个介于0和1之间的实数,类型为double,返回它的二进制表示。如果该数字无法精确地用32位以内的二进制表示,返回“Error”。给定一个double num,表示0到1的实数,请返回一个string,代表该数的二进制表示或者“Error”。测试样例:0.625返回:0.101import java.util.*;public原创 2017-05-28 19:35:24 · 510 阅读 · 0 评论 -
程序员面试金典——集合栈_
题目描述请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈。该数据结构应支持与普通栈相同的push和pop操作。给定一个操作序列int[][2] ope(C++为vector>),每个操作的第一个数代表操作类型,若为1,则为push操作,后一个数为应push的数字;若为2,则为pop操作,后一个数无意义。请返回一个i原创 2017-05-28 20:19:09 · 252 阅读 · 0 评论 -
程序员面试金典——输出单层结点
题目描述对于一棵二叉树,请设计一个算法,创建含有某一深度上所有结点的链表。给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,请返回一个链表ListNode,代表该深度上所有结点的值,请按树上从左往右的顺序链接,保证深度不超过树的高度,树上结点的值为非负整数且不超过100000。思路:用层次遍历,用size控制每层的数量。每次dep--原创 2017-05-28 21:20:22 · 219 阅读 · 0 评论 -
程序员面试金典——整数转化__(位运算)
题目描述编写一个函数,确定需要改变几个位,才能将整数A转变成整数B。给定两个整数int A,int B。请返回需要改变的数位个数。测试样例:10,5返回:4思路:改变几位就是算它们之间不同的位的个数。用异或(相同位为1,不同位为0),然后算异或后的数 里面有多少个1.import java.util.*;public class Transf原创 2017-05-29 11:09:33 · 283 阅读 · 0 评论 -
程序员面试金典——奇偶位交换__(位运算)
题目描述请编写程序交换一个数的二进制的奇数位和偶数位。(使用越少的指令越好)给定一个int x,请返回交换后的数int。测试样例:10返回:5思路://提取一个数的奇数位:x&0x55555555;奇数位全置1,偶数位全置0//提取一个数的偶数位:x&0xAAAAAAAA;奇数位全置0,偶数位全置1//互换位置:提取奇偶位后移动一下,原创 2017-05-30 11:25:29 · 418 阅读 · 0 评论 -
程序员面试金典——子串判断
题目描述现有一个小写英文字母组成的字符串s和一个包含较短小写英文字符串的数组p,请设计一个高效算法,对于p中的每一个较短字符串,判断其是否为s的子串。给定一个string数组p和它的大小n,同时给定string s,为母串,请返回一个bool数组,每个元素代表p中的对应字符串是否为s的子串。保证p中的串长度小于等于8,且p中的串的个数小于等于500,同时保证s的长度小于等于10原创 2017-06-03 09:42:30 · 248 阅读 · 0 评论 -
程序员面试金典——原串翻转
题目描述请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。给定一个string iniString,请返回一个string,为翻转后的字符串。保证字符串的长度小于等于5000。测试样例:"This is nowcoder"返回:"redocwon si sihT"import java.util.*;原创 2017-04-11 11:01:54 · 342 阅读 · 0 评论 -
程序员面试金典——确定两串乱序同构
题目描述给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。这里规定大小写为不同字符,且考虑字符串重点空格。给定一个string stringA和一个stringstringB,请返回一个bool,代表两串是否重新排列后可相同。保证两串的长度都小于等于5000。测试样例:"This is nowcoder","is This nowco原创 2017-04-11 11:06:50 · 339 阅读 · 0 评论 -
程序员面试金典——空格替换
题目描述请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。给定一个string iniString 为原始的串,以及串的长度 int len, 返回替换后的string。测试样例:"Mr John Smith”,13返回:"Mr%20Joh原创 2017-04-12 14:16:08 · 267 阅读 · 0 评论 -
程序员面试金典——清除行列
题目描述请编写一个算法,若N阶方阵中某个元素为0,则将其所在的行与列清零。给定一个N阶方阵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]原创 2017-04-12 14:19:24 · 253 阅读 · 0 评论 -
程序员面试金典——基本字符串压缩
题目描述利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。给定一个string iniString为待压缩的串(长度小于等于10000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。测试样例"aab原创 2017-04-12 19:41:18 · 305 阅读 · 0 评论 -
程序员面试金典——下一个较大元素
题目描述现在我们有一个int数组,请你找出数组中每个元素的下一个比它大的元素。给定一个int数组A及数组的大小n,请返回一个int数组,代表每个元素比他大的下一个元素,若不存在则为-1。保证数组中元素均为正整数。测试样例:[11,13,10,5,12,21,3],7返回:[13,21,12,12,21,-1,-1]思路:从后向前维护一个递减栈原创 2017-05-26 21:48:24 · 479 阅读 · 0 评论 -
程序员面试金典——矩阵元素查找
题目描述有一个NxM的整数矩阵,矩阵的行和列都是从小到大有序的。请设计一个高效的查找算法,查找矩阵中元素x的位置。给定一个int有序矩阵mat,同时给定矩阵的大小n和m以及需要查找的元素x,请返回一个二元数组,代表该元素的行号和列号(均从零开始)。保证元素互异。测试样例:[[1,2,3],[4,5,6]],2,3,6返回:[1,2]思路:最佳答案:没有之原创 2017-05-17 19:24:25 · 302 阅读 · 0 评论 -
程序员面试金典——井字棋
题目描述对于一个给定的井字棋棋盘,请设计一个高效算法判断当前玩家是否获胜。给定一个二维数组board,代表当前棋盘,其中元素为1的代表是当前玩家的棋子,为0表示没有棋子,为-1代表是对方玩家的棋子。测试样例:[[1,0,1],[1,-1,-1],[1,-1,0]]返回:true思路:直接暴力吧。import java.util.*;publi原创 2017-05-11 16:54:55 · 641 阅读 · 0 评论 -
程序员面试金典——链表分割
题目描述编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。解题思路:用两个链表,一个head放小于的,一个tail放大于等于的。然后将它们合并。注意代码中注释的地方,特别容易错误原创 2017-04-13 22:38:08 · 222 阅读 · 0 评论 -
程序员面试金典——二叉树平衡检查
题目描述实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1。给定指向树根结点的指针TreeNode* root,请返回一个bool,代表这棵树是否平衡。思路1:(这种是低效的。但是比较容易想)先序遍历 求深度 取深度 放入集合中。最后将集合 遍历 比较最大值 跟最小值 。注意 某一节点原创 2017-04-17 17:15:17 · 334 阅读 · 0 评论 -
程序员面试金典——双栈排序
题目描述请编写一个程序,按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。给定一个int[] numbers(C++中为vector<int>),其中第一个元素为栈顶,请返回排序后的栈。请注意这是一个栈,意味着排序过程中你只能访问到第一个元素。测试样例:[1,2,3,4,5]返回:[5,4,原创 2017-04-18 14:21:21 · 268 阅读 · 0 评论 -
程序员面试金典——高度最小的BST
题目描述对于一个元素各不相同且按升序排列的有序序列,请编写一个算法,创建一棵高度最小的二叉查找树。给定一个有序序列int[] vals,请返回创建的二叉查找树的高度。思路:每次取出数组中点,然后分左右子树,依次递归即可。import java.util.*;public class MinimalBST { public int原创 2017-04-19 15:46:25 · 273 阅读 · 0 评论 -
程序员面试金典——检查是否为BST
题目描述请实现一个函数,检查一棵二叉树是否为二叉查找树。给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树。思路:通过中序遍历(中序遍历恰好符合二叉查找树左小右大的特点,能够按大小顺序读)将节点的值存入栈中,最后依次判定栈中是否为升序。是升序就是。import java.util.*;/*pub原创 2017-04-19 16:11:07 · 431 阅读 · 0 评论 -
程序员面试金典——最近公共祖先
题目描述有一棵无穷大的满二叉树,其结点按根结点一层一层地从左往右依次编号,根结点编号为1。现在有两个结点a,b。请设计一个算法,求出a和b点的最近公共祖先的编号。给定两个int a,b。为给定结点的编号。请返回a和b的最近公共祖先的编号。注意这里结点本身也可认为是其祖先。测试样例:2,3返回:1思路:满二叉树的子节点与父节点之间的关系为root =原创 2017-04-20 14:40:44 · 210 阅读 · 0 评论 -
程序员面试金典——寻找下一个结点
题目描述请设计一个算法,寻找二叉树中指定结点的下一个结点(即中序遍历的后继)。给定树的根结点指针TreeNode* root和结点的值int p,请返回值为p的结点的后继结点的值。保证结点的值大于等于零小于等于100000且没有重复值,若不存在后继返回-1。方法1:思路:通过非递归的中序遍历的方法(迭代)。通过栈的方法 可以立刻返回。import jav原创 2017-04-20 20:32:06 · 271 阅读 · 0 评论 -
程序员面试金典——上楼梯
题目描述有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶、3阶。请实现一个方法,计算小孩有多少种上楼的方式。为了防止溢出,请将结果Mod 1000000007给定一个正整数int n,请返回一个数,代表上楼的方式数。保证n小于等于100000。测试样例:1返回:1思路:为n时(n大于3),n可以由n-1的地方跨1步上来,也可以由n-2地方跨2台阶原创 2017-05-05 15:53:11 · 258 阅读 · 0 评论 -
程序员面试金典——机器人走方格2
题目描述有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。注意这次的网格中有些障碍点是不能走的。给定一个int[][] map(C++ 中为vector >),表示网格图,若map[i][j]为1则说明该点不是障碍点,否则则为障碍。另外给定int x,int y,表示网格的大小。请返回机器人从(0,0)走到原创 2017-05-06 15:36:57 · 387 阅读 · 0 评论 -
程序员面试金典——魔术索引1
题目描述在数组A[0..n-1]中,有所谓的魔术索引,满足条件A[i]=i。给定一个升序数组,元素值各不相同,编写一个方法,判断在数组A中是否存在魔术索引。请思考一种复杂度优于o(n)的方法。给定一个int数组A和int n代表数组大小,请返回一个bool,代表是否存在魔术索引。测试样例:[1,2,3,4,5]返回:false思路:看到有序就原创 2017-05-07 15:07:23 · 361 阅读 · 0 评论 -
程序员面试金典2——魔术索引2
题目描述在数组A[0..n-1]中,有所谓的魔术索引,满足条件A[i]=i。给定一个不下降序列,元素值可能相同,编写一个方法,判断在数组A中是否存在魔术索引。请思考一种复杂度优于o(n)的方法。给定一个int数组A和int n代表数组大小,请返回一个bool,代表是否存在魔术索引。测试样例:[1,1,3,4,5]返回:true思路:不下降序,就是可能出现原创 2017-05-07 15:14:04 · 276 阅读 · 0 评论 -
程序员面试金典——集合的子集______
题目描述请编写一个方法,返回某集合的所有非空子集。给定一个int数组A和数组的大小int n,请返回A的所有非空子集。保证A的元素个数小于等于20,且元素互异。各子集内部从大到小排序,子集之间字典逆序排序,见样例。测试样例:[123,456,789]返回:{[789,456,123],[789,456],[789,123],[456 123],[789],[456]原创 2017-05-08 15:11:49 · 397 阅读 · 0 评论 -
程序员面试金典——字符串排列______
题目描述编写一个方法,确定某字符串的所有排列组合。给定一个string A和一个int n,代表字符串和其长度,请返回所有该字符串字符的排列,保证字符串长度小于等于11且字符串中字符均为大写英文字符,排列中的字符串按字典序从大到小排序。(不合并重复字符串)测试样例:"ABC"返回:["CBA","CAB","BCA","BAC","ACB","ABC"]原创 2017-05-09 20:42:08 · 354 阅读 · 0 评论 -
程序员面试金典——合法括号序列判断
题目描述对于一个字符串,请设计一个算法,判断其是否为一个合法的括号串。给定一个字符串A和它的长度n,请返回一个bool值代表它是否为一个合法的括号串。测试样例:"(()())",6返回:true测试样例:"()a()()",7返回:false测试样例:"()(()()",7返回:false思路:这道题刚开始理解有问题,还以原创 2017-05-11 15:15:03 · 338 阅读 · 0 评论 -
程序员面试金典——无缓存交换___
题目描述请编写一个函数,函数内不使用任何临时变量,直接交换两个数的值。给定一个int数组AB,其第零个元素和第一个元素为待交换的值,请返回交换后的数组。测试样例:[1,2]返回:[2,1]思路1:直接交换,不利用中间变量。但是加法可能会导致溢出import java.util.*;public class Exchange { pub原创 2017-05-11 16:44:50 · 475 阅读 · 0 评论 -
程序员面试金典——翻转子串
题目描述假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。给定两个字符串s1,s2,请返回bool值代表s2是否由s1旋转而成。字符串中字符为英文字母和空格,区分大小写,字符串长度小于等于1000。测试样例:"Hello world原创 2017-04-12 22:04:33 · 661 阅读 · 0 评论 -
程序员面试金典——输出单层结点
题目描述对于一棵二叉树,请设计一个算法,创建含有某一深度上所有结点的链表。给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,请返回一个链表ListNode,代表该深度上所有结点的值,请按树上从左往右的顺序链接,保证深度不超过树的高度,树上结点的值为非负整数且不超过100000。解题思路:前序遍历二叉树,然后依次判定原创 2017-04-21 09:53:19 · 189 阅读 · 0 评论 -
程序员面试金典——数组中的逆序对___
题目描述有一组数,对于其中任意两个数组,若前面一个大于后面一个数字,则这两个数字组成一个逆序对。请设计一个高效的算法,计算给定数组中的逆序对个数。给定一个int数组A和它的大小n,请返回A中的逆序对个数。保证n小于等于5000。测试样例:[1,2,3,4,5,6,7,0],8返回:7思路: 数组的逆序对就是求————(当前数组长度原创 2017-05-25 19:44:54 · 310 阅读 · 0 评论 -
程序员面试金典——阶乘尾零
题目描述请设计一个算法,计算n的阶乘有多少个尾随零。给定一个int n,请返回n的阶乘的尾零个数。保证n为正整数。测试样例:5返回:1思路:有多少个0,就是计算有几对5和2的乘积。由于2的数量始终比5大,那么最后只要数出5的个数就可以。直接求 N=(n/5)+(n/25)+...+(n/(5^i)) (i=1,....直到5^i>N)原创 2017-05-25 19:57:55 · 252 阅读 · 0 评论 -
程序员面试金典——最小调整有序___
题目描述有一个整数数组,请编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n-m应该越小越好,也就是说,找出符合条件的最短序列。给定一个int数组A和数组的大小n,请返回一个二元组,代表所求序列的起点和终点。(原序列位置从0开始标号,若原序列有序,返回[0,0])。保证A中元素均为正整数。测试样例:[1,4,6,5,9,10],6原创 2017-05-25 20:20:53 · 260 阅读 · 0 评论 -
程序员面试金典——单词最近距离
题目描述有一篇文章内含多个单词,现给定两个单词,请设计一个高效算法,找出文中这两个单词的最短距离(即最少相隔的单词数,也就是两个单词在文章中位置的差的绝对值)。给定一个string数组article,代表所给文章,同时给定文章的单词数n和待查找的两个单词x和y。请返回两个单词的最短距离。保证两个单词均在文中出现且不相同,同时保证文章单词数小于等于1000。思原创 2017-06-03 10:38:45 · 346 阅读 · 0 评论