
面试算法
Wanna926
未来不迎,当下不杂,既往不恋。
展开
-
阿里 2017校招内推 电话面试
(小伙伴刚刚经历的阿里一面。。。。。)接电话。。。。。。登邮箱。。。。。。在线编程!!!!!1、将一个单链表排序。直接循环不断比较选择排序 O(n2)归并排序电话那头:用快速排序吧。。。。。。。2、求两个数组的交集。用hashmap存第一个数组,遍历第二个数组的时候求出交集山的那头:你没问我数组是不是排序的啊。原创 2016-08-13 16:04:20 · 2065 阅读 · 1 评论 -
用生动故事讲解动态规划
----第一节----初识动态规划--------经典的01背包问题是这样的:有一个包和n个物品,包的容量为m,每个物品都有各自的体积和价值,问当从这n个物品中选择多个物品放在包里而物品体积总数不超过包的容量m时,能够得到的最大价值是多少?[对于每个物品不可以取多次,最多只能取一次,之所以叫做01背包,0表示不取,1表示取]为了用一种生动又更形象的方式来讲解此题,我把此题用另一转载 2016-07-22 09:58:23 · 460 阅读 · 0 评论 -
【剑指offer】字符串的排列
题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。分析:先不考虑字母顺序输出,要求所有排列,可将第一个字母与其后所有字符依次交换,再固定第一个字符,其后字符相互交换----引用递归思路。排序使用两种方式实现,见代码。原创 2016-07-13 16:36:21 · 332 阅读 · 0 评论 -
【剑指offer】二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。分析: 树本身为二叉搜索树,具有一定的排序规律,要调整成为排序双向链表,需要知道,原本树的根节点右指针指向的元素比根节点大,左指针需要调整指向比根节点小的元素。且整棵树中,最小的节点是最左的节点,最大的节点是最右的节点。二叉树左右节点调整可以采用递原创 2016-07-11 11:24:34 · 325 阅读 · 0 评论 -
【剑指offer】复杂链表的复制
题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),实现链表的复制。分析:首先想到的是先将链表的下一个节点链路复制出一条链表,再从头开始将链表的任意节点指针复制,问题在于任意节点的指针可以指向任意位置,每个节点都要从头查找。由于链表的顺序性,可以将复制链表复制在原链表内部,最后拆分为两个单独的复杂链表即可。这样原创 2016-06-23 10:04:25 · 618 阅读 · 0 评论 -
【剑指offer】二叉树中和为某一值的路径
题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。分析:深度优先遍历,将节点的值加入路径中,没有达到预定值,继续深入,超出预定值后退到上一节点。需要注意有可能有多条路径符合条件,要将多条路径都返回。实现:public ArrayList> FindPath(Tre原创 2016-06-22 14:21:26 · 305 阅读 · 0 评论 -
【剑指offer】二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。分析:后序遍历的最后一个值为二叉树的根节点值,判断是否为二叉搜索树,递归判断是否左子树节点都小于根,右子树节点都大于根。因此,可以先从序列中找到比根小的值,判定为左子树,后续的值应该为右子树,如果比根大,直接返回false。原创 2016-06-22 13:59:32 · 277 阅读 · 0 评论 -
【剑指offer】从上往下打印二叉树
题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。分析:层序遍历需借助队列,将节点入队出队进行遍历。实现://import java.util.LinkedList;//import java.util.Queue; public ArrayList PrintFromTopToBottom(TreeNode root) { Queue qu原创 2016-06-22 13:45:56 · 239 阅读 · 0 评论 -
【剑指offer】栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。分析:可借助一个栈,根据压入顺序将数据压入栈中,每次压入,要判断栈顶元素是否为弹出顺序组的元素,决定是继续原创 2016-06-22 11:09:17 · 263 阅读 · 0 评论 -
【剑指offer】包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。分析:定义一个的栈用于保存最小值,每次进栈一个元素就与当前最小值比较,判断是进栈最小值还是当前值,用以保证栈中每个位置对应的都是数据栈数据对应的最小值;出栈时,数据栈与最小值栈都出栈一个元素,用以保证数据栈与最小值栈最小值的统一。实现:import java.util.Sta原创 2016-06-22 11:03:17 · 290 阅读 · 0 评论 -
【剑指offer】顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.分析:原创 2016-06-21 21:19:31 · 255 阅读 · 0 评论 -
【剑指offer】二叉树的镜像(递归+非递归)
题目:操作给定的二叉树,将其变换为源二叉树的镜像。 分析:求二叉树镜像,即将二叉树的左右子树交换,直至叶子结点。实现:(递归)public void Mirror(TreeNode root) { if (root == null) { return; } if (root.left == null && root.right == null) {原创 2016-06-21 20:32:19 · 271 阅读 · 0 评论 -
【剑指offer】树的子结构
题目:输入两颗二叉树A,B,判断B是不是A的子结构。分析:判断两棵树是否相包含,可以从头结点开始比较,如果比较得到相同的结点,递归比较左右是否相同。实现:public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { boolean原创 2016-06-20 21:46:51 · 225 阅读 · 0 评论 -
【剑指offer】合并两个排序的链表
题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。分析:两个链表已是递增,只需要从头遍历,将较小的结点插入新链表,移动指针,继续比较即可。简单程序要注意鲁棒性。实现:public ListNode Merge(ListNode list1, ListNode list2) { if (list1 == nul原创 2016-06-20 21:23:11 · 279 阅读 · 0 评论 -
【剑指offer】反转链表(递归+非递归)
题目:输入一个链表,反转链表后,输出链表的所有元素。分析:反转链表只需改变链接方向,改变方向时需要将原本指向后一个结点的链接方向指向前一个结点,因此需要记录下三个结点。实现:public ListNode ReverseList(ListNode head) { ListNode cur = head; ListNode next = null; Li原创 2016-06-20 21:04:47 · 2337 阅读 · 0 评论 -
【剑指offer】(扩展)求链表中间结点
题目:求链表中间结点,如果链表结点数为奇数,返回中间结点;如果链表结点为偶数,返回中间两个结点中的任意一个。分析:首先想到的方式还是遍历一次求出节点个数,第二次遍历走一半个数得到中间结点。灵活应用快慢指针,快指针每次走2步,慢指针每次走1步,快指针走到链表尾部时,慢指针走到中间。实现:public static ListNode find(ListNode原创 2016-06-20 20:34:04 · 429 阅读 · 0 评论 -
【剑指offer】链表中倒数第k个结点
题目:输入一个链表,输出该链表中倒数第k个结点。分析:链表只能从链表头结点向后一个个访问,要求倒数第K个,需要知道一共有多少个,进而知道倒数第K个是正数多少个。求个数需要先遍历一遍。最先想到的方式往往不是最优的,可以进一步改进。链表的题目要结合两个指针快慢走操作,两个指针一次遍历可以找到倒数第K个,可以先让一个走K-1步,一个不动,此时两个相差K步,之后两个指针同时原创 2016-06-20 20:13:33 · 290 阅读 · 0 评论 -
【剑指offer】调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。分析:数组的题目,调整位置需要移动元素,时间复杂度为O(n^2),因此通常需要另辟蹊径。设定两个指针指向数组头尾,移动指针,达到判断条件时交换两个元素,直至两个指针相遇或交错。小技巧:判断奇数偶数使用位与操作。实现:pub原创 2016-06-19 20:34:59 · 275 阅读 · 0 评论 -
【剑指offer】O(1)时间删除链表结点
题目:给定单向链表的头结点和一个结点,定义一个函数在O(1)时间内删除该结点。分析:删除链表结点常规做法为:按照链表特点从头结点找到该节点前一个结点,通过移动指针将指定结点从链表摘除,时间为O(n);更简单方式为:通过已知的要删除结点,将下一个结点的值复制到该结点,再移动指针从链表摘除下一个结点,模拟删除该阶段操作,时间为O(1);链表操作要注意链表节点的定义方式;头结原创 2016-06-19 20:12:00 · 303 阅读 · 0 评论 -
【剑指offer】(扩展)大数相加
问题:实现一个加法,将两个大数相加,不使用BigInteger。分析:使用字符串或者数组,实现每位相加进位,要注意两个数对齐及最终进位的情况。首先将两个字符串倒置,方便补0将位数对齐及逐位相加。并且使用StringBuffer方便字符串修改。注意:字符实现逐位相加,要将字符转为为数值或求出字符表示的数值大小。实现:public String bigAdd原创 2016-06-19 15:39:31 · 920 阅读 · 0 评论 -
【剑指offer】打印1到最大的n位数
题目:输入数字n,按照顺序打印从1到最大的n位十进制数字。如:输入3,打印出:1,2,3,4........998,999。分析:简单的题目,求出最大的n位数字,循环打印即可。面试过程中越简单的题目越值得推敲,考虑可扩展考察的知识点。此题没有明确n的值,因此基本的整数类型可能超出表示范围,此时最应考虑出数组及字符串表示数字的方式。循环打印的过程中,需要在每个数据的基础上原创 2016-06-19 14:15:50 · 532 阅读 · 0 评论 -
【剑指offer】数值的整数次方
题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。分析:简单题目,考察的是代码规范,与代码边界输入检测的完整性,要尽量写出鲁棒性较好的代码。求一个浮点数的整数次方,有几点需要注意,底数是否为0,指数正负及0的情况;底数及指数同时为0时如何返回,用什么值表示输入无效。实现:public cl原创 2016-06-19 10:51:55 · 225 阅读 · 0 评论 -
【剑指offer】二进制中1的个数
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。分析:原创 2016-06-19 10:50:55 · 228 阅读 · 0 评论 -
【剑指offer】(扩展)Excel字母表示列号
题目:Excel中使用大写字母表示列号,例如A表示1,B表示2.......AA表示27.......根据输入的字母,判断列号。分析:使用字母来引入“二十六进制”,相当于对“二十六进制”进行计算为十进制。同时要知道大写字母A表示的数字65,65-90为26个大写英文字母,97-122为26个小写英文字母。实现:public int lineNum(Strin原创 2016-06-17 15:50:54 · 823 阅读 · 0 评论 -
【剑指offer】覆盖矩形
题目:用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?分析:小矩形为两行一列,大矩形为两行n列,用小矩形从左向右覆盖大矩形的话,小矩形只能横着放或者竖着放。从最左边开始,如果竖着放,则相当于右边还有n-1个等待计算多少种方式,如果横着放,只占据一行两列,则相邻的下面两个也必须是由一个横着放。因此右边有n-2原创 2016-06-17 15:07:43 · 253 阅读 · 0 评论 -
【剑指offer】斐波那契数列--递归及循环剖析
题目:输入一个整数n,请你输出斐波那契数列的第n项。f(n) = f(n-1) + f(n-2) ; (其中n>1,f(1) = 1,f(0) = 0 )分析:根据题目公式可以判断使用递归或循环,首先分析递归及循环。(1) 重复多次计算相同问题时使用。递归要注意递归出口,循环要注意循环条件。(2) 递归代码简洁。而函数自身调用,有时间原创 2016-06-17 14:57:46 · 705 阅读 · 0 评论 -
【剑指offer】旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。分析:首先想到的是从头到尾遍历一次,选出最小值,时间复杂度为O(n)。原创 2016-06-16 20:49:47 · 317 阅读 · 0 评论 -
【剑指offer】(扩展)员工年龄排序
1.题目:对员工的年龄进行排序,要求时间效率为O(n),并且员工大约几万名,最大年龄为99。原创 2016-06-16 20:26:39 · 731 阅读 · 1 评论 -
【剑指offer】(扩展)两个队列实现栈
题目:用两个队列来实现一个栈,完成栈的Push和Pop操作。栈中的元素为int类型。分析:(1)清楚队列和栈的特性:栈--先进后出;队列--先进先出。(2)知道java中实现队列的方式:Queue接口,LinkedList实现类。(3)操作过程难以理解的话,结合队列与栈的图例进行分析。刚开始,入栈的元素添加到第一个队列中,当需要出栈的时候,发现此时能弹出的元素只原创 2016-06-14 13:53:26 · 414 阅读 · 0 评论 -
【剑指offer】用两个栈实现队列
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。分析:队列的特点是先进先出;栈的特点是先进后出。使用栈模拟队列,进入的操作没有区别,每个进入的元素排队进入就可以。题目给出两个栈,先进后出正可以将第一个栈的内容倒入第二个栈中,出栈就是先进先出的样子了。因此,可以用一个栈记录进栈元素,另一个栈用于出栈倒序,需要出栈时,就判定第二原创 2016-06-14 13:37:24 · 330 阅读 · 0 评论 -
【剑指offer】重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。分析:根据二叉树的前、中遍历,可以构建出二叉树。根据构建过程,前序遍历的第一个元素即为二叉树的根,由此跟在中序遍历中可以将序列分为左右原创 2016-06-13 21:31:25 · 409 阅读 · 0 评论 -
【剑指offer】从尾到头打印链表
输入一个链表,从尾到头打印链表每个节点的值。原创 2016-06-12 20:45:41 · 453 阅读 · 0 评论 -
【剑指offer】排序数组合并
Java算法面试必看宝典《剑指offer》题目思路分析及实现代码。原创 2016-06-12 16:46:26 · 370 阅读 · 0 评论 -
【剑指offer】替换空格
Java算法面试必看宝典《剑指offer》题目思路分析及实现代码。原创 2016-06-12 16:05:34 · 350 阅读 · 0 评论 -
【剑指offer】二维数组中的查找
Java算法面试必看宝典《剑指offer》题目思路分析及实现代码。原创 2016-06-12 15:32:24 · 391 阅读 · 0 评论