算法
姚大路
这个作者很懒,什么都没留下…
展开
-
序列化二叉树
题目请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列...原创 2019-09-15 19:13:49 · 176 阅读 · 0 评论 -
和为S的连续正数序列
题目小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!思考解法一:中位数对于符合条件的连续正数...原创 2019-09-01 20:11:35 · 165 阅读 · 0 评论 -
平衡二叉树
题目输入一棵二叉树,判断该二叉树是否是平衡二叉树。思考解法一:递归如果一棵二叉树是平衡二叉树,那么他的左子树和右子树都是平衡二叉树,并且左子树和右子树的深度差小于等于一。因此可以利用递归法来实现。递归的base_condition是空树,空树也是平衡二叉树。解法二:后序遍历转载请注明:剑指Offer(三十九):平衡二叉树 | Jack Cui如果我们用后序遍历的方式遍历二叉树的每一...原创 2019-09-01 18:04:33 · 340 阅读 · 0 评论 -
二叉树的深度
题目输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思考层次遍历,退出循环时,layer记录叶节点的深度。代码# -*- coding:utf-8 -*-class TreeNode: def __init__(self, x): self.val = x self.left...原创 2019-09-01 17:41:05 · 74 阅读 · 0 评论 -
两个链表的第一个公共节点
两个单向无环链表的第一个公共节点输入两个链表,找出它们的第一个公共结点。思路解法一快慢指针图片转自剑指Offer(三十六):两个链表的第一个公共结点 | Jack Cui如图所示,确定两个单向无环链表的公共节点,分为两部分。首先,B先走,直到B的链表长度等于A的链表长度。然后,A,B一起走,直到A,B相等,就是要找的第一个公共节点。解法二反转链表需要注意的是,两个单向无环链...原创 2019-06-29 20:01:57 · 143 阅读 · 0 评论 -
第一个只出现一次的字符
第一个只出现一次的字符在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).思路词典。记录char和次数的词典。代码# -*- coding:utf-8 -*-class Solution: def FirstNotRepeatingChar(self, s): ...原创 2019-06-29 16:39:05 · 80 阅读 · 0 评论 -
丑数
丑数把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路队列与数组根据丑数的性质,可以得出丑数的计算公式:ugly=2x∗3y∗5zugly = 2^x*3^y*5^zugly=2x∗3y∗5z因此,(x,y,z)的任意组合,可以得到丑数。问题就转化为...原创 2019-06-29 16:31:50 · 345 阅读 · 0 评论 -
把数组排成最小的数
把数组排成最小的数输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路比较器定义一种新的比较规则,如果eval(str(num1)+str(num2))<eval(str(num2)+str(num1))eval(str(num1)+str(nu...原创 2019-06-29 15:23:05 · 90 阅读 · 0 评论 -
整数1出现的次数(从1到n的整数中)
整数1出现的次数(从1到n的整数中)求出1-13的整数中1出现的次数,并算出100-1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。思路求余遍历1到n的所有整数。对于每个整...原创 2019-06-29 15:03:41 · 126 阅读 · 0 评论 -
连续子数组的最大和
连续子数组的最大和HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大...原创 2019-06-29 14:47:58 · 109 阅读 · 0 评论 -
数组中出现次数超过一半的数字
数组中出现次数超过一半的数字数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路解法一词典建立数字和出现次数的词典。首先,遍历数组,统计出现次数。进行第二遍数组遍历时,每次查询词典,判断该数字出现的次数是否超过一半,如果超过,...原创 2019-06-29 11:25:55 · 154 阅读 · 0 评论 -
二叉搜索树与双向链表
二叉搜索树与双向链表思路递归假设左子树和右子树在k=n-1步时,已经转换成相应的双向链表.那么在k=n时,只需要遍历左子树找到左子树最右边的节点,将其与根节点链接成双向链表,即root.left,left.right=left,rootroot.left, left.right = left, rootroot.left,left.right=left,root同样,遍历右子树找...原创 2019-06-29 09:39:43 · 106 阅读 · 0 评论 -
和为S的两个数字
题目输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。思考解法:滑动窗口法思路类似和为S的连续正数序列解法二。需要注意的是,有可能数组中没有满足条件的这对数,需要返回空数组。代码# -*- coding:utf-8 -*-class Solution: def FindNumbersWithSu...原创 2019-09-01 20:25:27 · 64 阅读 · 0 评论 -
左旋转字符串
题目汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!思考解法一:带尾指针的单向循环链表将字符串创建成单向循环链表,因此改变头指针self,__hea...原创 2019-09-01 20:56:37 · 100 阅读 · 0 评论 -
把二叉树打印成多行
题目从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路解法一:队列+层次遍历利用队列的先进先出特性,可以模拟二叉树的层次遍历。将根节点入队,打印结点值,将其左节点和右节点先后入队。将队列中的元素从index=0处,出队,打印结点的值,将各个结点的左右结点先后入队。以此往复,实现二叉树的层次遍历。代码# -*- coding:utf-8 -*-# class...原创 2019-09-15 17:06:15 · 150 阅读 · 0 评论 -
对称的二叉树
题目请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路递归+对称以先序遍历二叉树(中->左->右),因为二叉树的对称性, 所以如果按照中->右->左遍历,那么两次遍历的结果应该是相同的。需要注意的是,如果二叉树各个结点值相同,那么上述结论将无法判断该二叉树是否是对称二叉树,因此我们需要在遍历到叶子结点...原创 2019-09-15 15:46:41 · 405 阅读 · 0 评论 -
二叉树的下一个结点
题目给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路解法一:递归+中序遍历如果中序遍历该二叉树,得到中序遍历的列表,只需要在列表中找到该结点,返回下一个即可。给出二叉树的任意结点,如何得到中序遍历列表呢,要利用这里的指向父节点的指针。根据结点和指向父节点的指针,可以得到二叉树的根节点,有了根节点就...原创 2019-09-15 15:12:29 · 129 阅读 · 0 评论 -
删除链表的重复节点
题目在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路列表法遍历链表,将节点值的值放入列表,再将列表中的所有元素组成链表。需要设置一个pre元素,如果要pre为空,说明列表空的,可以将链表中结点的值放入;如果pre...原创 2019-09-14 17:16:48 · 183 阅读 · 0 评论 -
链表中环的入口结点
题目给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路快慢指针若有一个快指针,一次走两步;一个慢指针,一次走一步,快慢指针能相遇说明存在环。相遇后,快指针指向头节点,快慢指针一次走一步,最终会相交在入口节点。【注意】Python中if语句的判定是有顺序的。代码# -*- coding:utf-8 -*-class ListNode: def ...原创 2019-09-14 15:16:04 · 110 阅读 · 0 评论 -
表示数值的字符串
题目请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。思路if-else分情况讨论引用Jack Cui的博客字符串可以表示为[sign]integral-digits[.[fractiona...原创 2019-09-14 14:39:56 · 111 阅读 · 0 评论 -
正则表达式匹配
题目请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配思路递归法因为通配符有两种,‘*’如果模式串中的前一个字符与字符串相同,可以匹配0,1,n个...原创 2019-09-14 13:30:44 · 148 阅读 · 0 评论 -
构建乘积数组
题目给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。思路解法一 循环首先,创建和A长度相同的B数组,通过两层循环,判断B的下标和A的下标是否相同,如果不同,就计算乘积。代码# -*- coding:utf-8 -*-class Solution: ...原创 2019-09-14 12:48:45 · 81 阅读 · 0 评论 -
把字符串转成整数
题目将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。思路解法一 循环因为字符串首尾有可能时符号位,因此从第二位开始检验是否为数字。如果从第二位到末尾都是数字,那么可以计算出他们的和。然后,检验字符串的第一位,有四种可能性:...原创 2019-09-14 10:37:30 · 166 阅读 · 0 评论 -
求1+2+3+...+n
题目求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路递归n = 1时,返回bool 1;n >= 1时,返回n + [1,2,3…n-1]的和。代码# -*- coding:utf-8 -*-class Solution: def Sum_Solution(self, n...原创 2019-09-14 09:54:01 · 169 阅读 · 0 评论 -
孩子们的游戏
题目每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小...原创 2019-09-14 09:47:21 · 180 阅读 · 0 评论 -
反转单词顺序列
题目牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思考解法一: 字符串操作...原创 2019-09-01 21:31:07 · 135 阅读 · 0 评论 -
复杂链表的复制
复杂链表的复制输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路解法一链表。通过在链表每个节点后插入copyNode完成复杂链表的复制。主要分为三个步骤:遍历链表,在每个节点后插入copyNode遍历链表,设置...原创 2019-06-29 09:08:34 · 77 阅读 · 0 评论 -
包含min函数的栈
包含min函数的栈定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。思路辅助栈利用辅助栈结构保存当前栈中的最小值,需要注意的是,只有当辅助栈为空时或辅助栈的栈顶大于要入栈的元素值时,元素才能被压入辅助栈。pop操作时,只有当栈顶元素和辅助栈元素相同时(栈顶元素是栈中的最小值),辅助栈也pop元素。代码# -*- coding:ut...原创 2019-06-24 22:00:41 · 88 阅读 · 0 评论 -
数组中重复的数字
数组中重复的数字在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路解法一词典。类似34题。解法二列表。列表元素的索引范围为[0,n-1],列表元素的取值范围为[0,...原创 2019-06-14 10:30:39 · 98 阅读 · 0 评论 -
数组中只出现一次的数字
数组中只出现一次的数字一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路解法一词典。解法类似第34题。解法二位运算。任何一个数字和他自己相异或的结果是0。因此,如果将数组中的数字,累计异或,那么两两重复异或结果为0,最后异或的结果是两个只出现一次的数字两两异或的结果。根据这个异或的结果,我们可以确定结果二进制中最低位1的下标。fir...原创 2019-06-13 21:55:26 · 99 阅读 · 0 评论 -
第一个只出现一次的字符
第一个只出现一次的字符在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).思路解法一str.count()。遍历str中每个字符,判断str.count(i)是否为1,如果为1直接返回index。遍历结束后,如果为1的if判断语句没有为真过,说明str中都是重复字符,返回-1....原创 2019-06-13 20:50:41 · 142 阅读 · 0 评论 -
字节流中第一个不重复的字符
字节流中第一个不重复的字符请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。思路队列先进先出。每次插入char,判断队列中是否存在,已存在就不插入。因此,队列中保存的元素都是不重复的,并且字节流中出现较早的元素在队列中靠前。代...原创 2019-06-13 20:40:08 · 158 阅读 · 0 评论 -
栈的压入、弹出序列
栈的压入、弹出序列输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路栈的先进后出原则。例1:如pushV=[1,2,3,4,5]。判断...原创 2019-06-13 20:27:47 · 134 阅读 · 0 评论 -
数字在排序数组中出现的次数
数字在排序数组中出现的次数统计一个数字在排序数组中出现的次数。思路解法一词典解法。key为数字,value为出现的次数。未考虑数组的排序特性。解法二二分法思想。由于数组是有序的,只需要寻找到该数字在数组中首次出现的first_index和最后一次出现的last_index,即可得到出现的次数为last_index-first_index+1。在有序数组中寻找first_index和...原创 2019-06-13 19:55:19 · 168 阅读 · 0 评论 -
数组中的逆序对
数组中的逆序对在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007思路归并排序变形。归并排序基于二分原理,将数组data分为data[low,mid]和data[mid+1,high]两部分,总的逆序对的个数等于前半部分逆序对数+后半部分逆序...原创 2019-06-13 19:35:10 · 115 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
调整数组顺序使奇数位于偶数前面输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路解法一高阶函数。使用Python中的高阶函数filter()和匿名函数lambda()。过滤得到奇数数组和偶数数组,通过列表拼接“+”操作得到结果。解法二插入排序变形。将数组array...原创 2019-06-13 19:08:05 · 171 阅读 · 0 评论 -
用两个栈实现队列&&旋转数组的最小数字
用两个栈实现队列用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路解法1将stack作为存储空间,temp作为临时缓冲区入队:直接压入stack出队:将stack中的元素全部压入temp中,再将temp的栈顶元素弹出,最后将temp中的元素再倒回到stack中。解法2含等待池的先到先服务入队时,直接压入stack出队时,判断temp是否为...原创 2019-05-13 10:33:48 · 118 阅读 · 0 评论 -
从尾到头打印链表&&重建二叉树
从尾到头打印链表输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。思路解法1栈结构存储数据。正向遍历,将node.val压栈,利用栈先进后出的特点,返回ArrayList。解法2链表结构反向。创建三个指针cur,pre,temp。遍历链表时,pre为cur的前驱节点,temp保存cur的后继节点后,修改cur的后继节点为pre。遍历结束时,cur指向空,pre指向尾节点...原创 2019-05-13 10:01:48 · 113 阅读 · 0 评论 -
二维数组中的查找&&替换空格
题目在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路在二维行列有序数组中,从右上角开始查找整数num时:1.num大于数组元素,向下走;2.num小于数组元素,向左走;3.如果等于,则返回True。当越过数组边界时,则返回False。查找...原创 2019-05-13 08:47:58 · 198 阅读 · 0 评论 -
二进制中1的次数
二进制中1的次数输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路解法一str.count()对于正整数,直接bin()转化为二进制字符串,统计字符串中1的个数;对于负数,转化为二进制后,利用dict实现求反码,转化为十进制后加1,对结果进行bin()操作,得到的就是负数的补码形式。统计补码的二进制字符串中1的个数即可。解法二高阶函数sum()和左移运算。首先...原创 2019-06-14 11:08:10 · 289 阅读 · 0 评论