
剑指offer
plugcy
精通数据库
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
丑数
题目描述:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。常规思路:丑数只能被2,3,5整除,所以碰到一个数,如果能被2整除,就一直整除2;如果能被3整除,就一直整除3;如果能被5整除,就一直整除5。如果最后得到1,说明该数是丑数,该思路的问题在于对于不是丑数的数也要去...原创 2018-04-13 11:05:43 · 172 阅读 · 0 评论 -
剑指offer-序列化二叉树
题目描述:请实现两个函数,分别用来序列化和反序列化二叉树解题思路:序列化二叉树是根据二叉树的前序遍历结果,对应的输出字符串,对应为空的指针用“#”代替反序列化二叉树就是根据得到的字符串,将大问题一分为三,首先创建根结点,然后创建左子树,最后创建右子树public class Solution {private String deserialize = "";String Serialize(T...原创 2018-05-30 17:23:02 · 426 阅读 · 0 评论 -
剑指offer——数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路:思路1:对数组进行排序,可以利用桶排序,排完以后再经过O(n)时间就能找出每个数字出现的次数,所以总得时间复杂度为O(nlogn)+O(n)思路2:遍历一遍数组,将数字和...原创 2018-05-31 23:36:12 · 1163 阅读 · 0 评论 -
剑指offer——扑克牌中的顺子
题目描述:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为...原创 2018-06-14 22:51:27 · 328 阅读 · 0 评论 -
剑指offer——圆圈中最后剩下的数字
题目描述:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去......原创 2018-06-14 23:34:52 · 258 阅读 · 0 评论 -
剑指offer——和为s的连续正数序列
题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!解题思路:首先确定一个最小数small为1,最...原创 2018-06-08 23:12:41 · 199 阅读 · 0 评论 -
剑指offer——n个骰子的点数
题目描述:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能出现的值出现的概率。解题思路:将n个骰子分为两堆,第一堆只有一个,剩下一堆有n-1个然后再计算n-1个骰子的点数之和,过程和第一步一致这显然是一种递归的解法总共n个骰子,有6~n种排列组合,骰子点数之和在n到6n之间,所以可以用一个5n+1的数组来存放出现点数之和的次数,将和为s的点数存放在数组的第s-n个元素...原创 2018-06-18 20:11:49 · 446 阅读 · 0 评论 -
剑指offer——滑动窗口的最大值
题目描述:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5...原创 2018-06-18 23:39:53 · 704 阅读 · 0 评论 -
剑指offer——重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路:前序遍历的第一个结点在中序遍历中,正好分成对应的左右两个部分,对应左子树和右子树对于左子树和右子树采用和1同样的方法明显这是一个递归,最终能够构...原创 2018-07-02 21:04:09 · 456 阅读 · 0 评论 -
剑指offer——二叉搜索树的后序遍历序列
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:可以采用递归的思路;数组的最后一个元素为根结点,找到一个比它大的元素,在此之前的全是左结点,在此之后的全是右结点,让后对左右结点递归判断,对于右结点中若找到有元素小于该根结点,说明这个不是二叉搜索树的后序遍历结果public boolean Ve...原创 2018-05-30 00:26:55 · 444 阅读 · 0 评论 -
剑指offer——在排序数组中查找数字出现的次数
题目描述:统计一个数字在排序数组中出现的次数。解题思路:利用折半查找思想,找到第一个目标值k和最后一个目标值k对于第一个k值求法:首先找到数组中间的值,若大于k,则在数组前半部分找;若小于k,则在后半部分找;若等于k,则判断前一个数是否是k,若不是说明这个就是第一个k,否则还是要在前半部分找第一个k对于最后一个k做法和求找第一个k差不多public int GetNumberOfK(int [] ...原创 2018-06-05 22:39:08 · 222 阅读 · 0 评论 -
剑指offer——栈的压入、弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路:用一个栈来模拟压入和弹出序列,在栈中根据压栈序列压入数据,当栈顶数据和弹出序列中的...原创 2018-05-29 16:20:47 · 401 阅读 · 0 评论 -
剑指offer:二叉树的下一个节点
题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。/*public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next =...原创 2018-05-14 15:54:49 · 381 阅读 · 0 评论 -
剑指offer——最小的k个数
题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题思路:解法1:和面试题39的思路3一样,都是基于快速排序的思想,找到一个基准元素的位置,如果基准元素正好是第k个数则结束,若在k个数后面,则在基准元素前面找,否则在后面找解法2:分为3个步骤——1. 从n个数中选前k个数,将其构造为大顶堆2. 对k个数后面的数,...原创 2018-06-02 19:56:16 · 846 阅读 · 0 评论 -
剑指offer——连续子数组之和
题目描述:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度...原创 2018-06-03 11:15:53 · 430 阅读 · 0 评论 -
剑指offer——调整数组顺序使得奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。public class Solution { public void reOrderArray(int [] array) { int low = 0; int high = ...原创 2018-05-23 00:14:49 · 338 阅读 · 0 评论 -
剑指offer——把数组排成最小的数
题目描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解题思路:将数组中的数看成字符串形式对于数组中的数,对将ab连接起来的字符串小于ba连接起来的字符创,则a应该放在b的前面最终按该规则将数组中的元素进行排序,然后将排完序的数组拼接成字符串即可public Stri...原创 2018-06-03 19:55:26 · 419 阅读 · 0 评论 -
剑指offer——合并两个排序的链表
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路:首先确保代码的鲁棒性,即对两个链表都为null,或者其中一个链表为null的特殊情况的处理;之后操作应该是,先确定合并后链表的头指针应该是指向第一个链表还是第二个链表,根据两个链表头指针所指向的数据的大小,然后遍历两个链表,依次将两个链表中的结点添加到新链表中,当一个链表指向末尾时,只需...原创 2018-05-23 17:24:52 · 287 阅读 · 0 评论 -
剑指offer——数组中的逆序对
题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007解题思路:顺序扫描数组的话,则每个数需要和n个数进行比较,时间复杂度为O(n~2),尝试更快的算法只是相邻两个数进行比较,将数组拆分成子数组,知道拆分一个个数组长度为1的小数组,然后两两归...原创 2018-06-04 20:41:24 · 202 阅读 · 0 评论 -
剑指offer——链表中环的入口结点
题目描述:一个链表中包含环,请找出该链表的环的入口结点。思路:对于判断一个链表是否有环,是通过双指针法,两个指针均指向链表头,一个每次挪一步,一个每次挪两步,如果最终两个指针能相遇,说明链表中有环。找到相遇的指针,然后绕着这个环一圈,就能得到环中的个数;根据环中的节点个数n,确定两个头指针,让一个先走n步,然后两个指针同时出发,当两个指针相遇的的时候就是环的入口。/* public class ...原创 2018-05-28 23:00:19 · 427 阅读 · 0 评论 -
剑指offer——删除重复的节点
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5解题思路1:首先创建一个头指针,同时有一个指针指向头结点,头结点向后判断是否有和它值一样的结点,一样的话找到相同值的结点的最后一个,然后用头指针指向该节点的下一个若不相同...原创 2018-07-12 23:14:03 · 491 阅读 · 0 评论