
剑指offer中不熟悉的题
超人不会飞、
这个作者很懒,什么都没留下…
展开
-
Java实现二叉树的递归、非递归,前序遍历、中序遍历、后序遍历;以及层次遍历
Java实现二叉树的递归、非递归,前序遍历、中序遍历、后序遍历;以及层次遍历递归前序遍历ArrayList<Integer> list = new ArrayList();public ArrayList<Integer> preOrder(TreeNode root) { if (root != null) { list.add(roo...原创 2019-10-07 10:47:18 · 168 阅读 · 0 评论 -
Java实现八大排序算法,以及这些排序算法时间复杂度、空间复杂度、稳定性等比较
Java实现八大排序算法,以及这些排序算法时间复杂度、空间复杂度、稳定性等比较冒泡排序 public void sort(int[] arr) { for (int i = 0; i < arr.length; i++) { int temp = 0; for (int j = 0; j < arr.length ...原创 2019-10-07 10:47:26 · 294 阅读 · 0 评论 -
正则表达式匹配
正则表达式匹配题目:请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配思路:首先,考虑特殊情况,1.当str为空的时候,如果pattern也为空,则返回tr...原创 2019-10-07 10:46:55 · 153 阅读 · 0 评论 -
约瑟夫环问题
约瑟夫环问题使用队列的思想最简单:public static int LastRemaining_Solution(int n, int m) { if(n <= 0 || m <= 0) { return -1; } LinkedList<Integer> list = new LinkedLis...原创 2019-10-07 10:47:09 · 124 阅读 · 0 评论 -
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:新建两个栈,在遍历每一行时,始终保证一个栈为空,另一个栈保存的是从左到右顺序的结点或者从右到左的结点;具体看代码public ArrayList<ArrayList<Integer> > Print(TreeNode ...原创 2019-10-07 11:19:48 · 314 阅读 · 0 评论 -
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:利用递归的思想,和镜像相同,那么从根节点开始,左子树,和右子树是对称的,递归左子树的左结点等于右子树的右结点,左子树的右结点等于右子树的左结点,或者同时为空;否则,返回falseboolean isSymmetrical(TreeNode pRoot) { i...原创 2019-10-07 11:19:56 · 166 阅读 · 0 评论 -
请实现两个函数,分别用来序列化和反序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字...原创 2019-10-07 11:20:04 · 383 阅读 · 0 评论 -
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的...原创 2019-10-07 11:20:14 · 369 阅读 · 0 评论 -
判断链表中是否有环,并找到环的入口点!
判断链表中是否有环,并找到环的入口点!思路:首先判断有环的思路:设定快慢指针slow、fast,快指针一次走两步,慢指针一次走一步,若链表中存在环,则两个指针必定相遇。其次,注意链表判空的条件问题。找到环后,再设定一个p指向头指针,遍历一遍链表,同时slow从fast.next开始遍历一遍整个环,若等于p,那么p就是环的入口点。public static ListNode EntryNo...原创 2019-10-07 11:20:22 · 258 阅读 · 0 评论 -
回溯法:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的
回溯法:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串...原创 2019-10-07 11:20:30 · 250 阅读 · 0 评论 -
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:分情况:1.该结点存在右子树,那么下一个结点肯定就是右子树结点中一直往左边遍历,直到尽头就是下一个结点2.该结点不存在右子树,那么又分两种情况, a.如果该结点是父结点的左子结点,那么直接返回父节点即可。 b.如果该结点是父节点的右子节点,那...原创 2019-10-07 11:20:37 · 291 阅读 · 0 评论 -
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路:丑数能够分解成2x*3y*5^z,所以只需要把得到的丑数不断地乘以2、3、5之后并放入他们应该放置的位置即可即:这题最关键的步骤在于把x,y,z三者的幂次方同时作为数组索引public int Ge...原创 2019-10-07 11:20:45 · 970 阅读 · 0 评论 -
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会...原创 2019-10-07 11:20:53 · 200 阅读 · 0 评论 -
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字
请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配思路:利用递归的思想:// 当第二个字符为 '*' 时,// 若str[index1] =...原创 2019-10-07 11:19:38 · 1385 阅读 · 0 评论 -
求逆序数
求逆序数在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007题目保证输入的数组中没有的相同的数字数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,size<=...原创 2019-10-07 11:19:29 · 233 阅读 · 0 评论 -
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val;...原创 2019-10-07 11:19:22 · 136 阅读 · 0 评论 -
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007思路:第一种思路:暴力解法。第二种思路:归并排序的方法。先将两个数组进行拆分,然后归并的时候统计逆序数就行了public class Solution { int count ...原创 2019-10-07 11:17:23 · 832 阅读 · 0 评论 -
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:将num1和num2转换成2进制,首先第一步,将num1与num2的二进制进行不进位相加,即进行 num1 ^ num2 操作。第二步,统计num1与num2二进制相加需要进位的位,即进行(num1 & num2) << 1 操作。第三步,将前两步的结果相加,直到没有进位,则结束。例...原创 2019-10-07 11:17:32 · 272 阅读 · 0 评论 -
题目:根据前序遍历规则,完成二叉树的序列化与反序列化。所谓序列化是指:遍历二叉树为字符串;所谓反序列化是指依据字符串重新构造二叉树。当在遍历二叉树时,如果碰到Null指针时,会用一个特殊字符”#“代替
题目:根据前序遍历规则,完成二叉树的序列化与反序列化。所谓序列化是指:遍历二叉树为字符串;所谓反序列化是指依据字符串重新构造二叉树。当在遍历二叉树时,如果碰到Null指针时,会用一个特殊字符”#“代替。思想:序列化可以采用递归前序遍历算法思想。反序列化,同样可以采用递归的思想。 // 序列化 String Serialize(TreeNode root) { String...原创 2019-10-07 11:17:42 · 183 阅读 · 0 评论 -
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路:第一种思路: 设置一个key用来存储当前认为是出现一半以上的数,令key = array[0];然后从index = 1 开始遍历,与key比较,若该数与key不相同,就减1...原创 2019-10-07 11:17:55 · 566 阅读 · 1 评论 -
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)public class Solution { private ArrayList<ArrayList<Integer>> list = new ArrayLis...原创 2019-10-07 11:18:03 · 275 阅读 · 0 评论 -
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思想:利用非递归中序遍历思想public TreeNode Convert(TreeNode pRootOfTree) { if (pRootOfTree == null) { return null; } ...原创 2019-10-07 11:18:12 · 336 阅读 · 0 评论 -
输入一棵二叉树,求该树的深度。
输入一棵二叉树,求该树的深度。思路:第一种采用递归算法;第二种采用非递归算法:采用层次遍历的思想,每次遍历一层,深度加1;关键是用count记录每一层遍历到了第几个元素,nextCount表示这一层一共有多少个元素,当count==nextCount时,树的深度加1;第一种思想: public int TreeDepth(TreeNode root) { if (ro...原创 2019-10-07 11:18:20 · 440 阅读 · 0 评论 -
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路:先利用求树的深度的算法,可以使用递归方法求树的深度;同时在递归的同时,判断每个结点的左右子树的高度是否满足平衡树即可。 public static boolean IsBalanced_Solution(TreeNode root) { if (root == null) { return tru...原创 2019-10-07 11:18:28 · 298 阅读 · 0 评论 -
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:因为是二叉搜索树,所以末尾肯定是根节点,则找到分开左子树和右子树的索引,index。index左边构成的新数组中所有数肯定都小于根节点;index右边构成的新数组中所有数肯定都大于根节点。因此可以借助递归的思想。递归下去,只要不符合条件就返回fals...原创 2019-10-07 11:18:46 · 351 阅读 · 0 评论 -
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。public class Solution { public int NumberOf1(int n) { int count = 0; int base = 1; for (int i = 1; i <= 32; i++) { if ((base...原创 2019-10-07 11:18:54 · 123 阅读 · 1 评论 -
(递归的精髓)输入一个链表,按链表从尾到头的顺序返回一个ArrayList
(递归的精髓)输入一个链表,按链表从尾到头的顺序返回一个ArrayList/*** public class ListNode {* int val;* ListNode next = null;* ListNode(int val) {* this.val = val;* }* }*/...原创 2019-10-07 11:19:04 · 219 阅读 · 0 评论 -
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)基本思想:1 先在每个结点后面新建一个结点,插入到原链表中的每个对应结点的后面2 在赋值原链表中random的指向3 将两个链表拆分,奇数位置上的结点链接起来是原链表,偶数位置...原创 2019-10-07 11:19:14 · 166 阅读 · 0 评论 -
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路: 这题思路很简单,但是实现起来挺麻烦public static ListNode deleteDuplication(ListNode pHead) { ...原创 2019-10-07 11:17:10 · 160 阅读 · 0 评论