
刷题
Treasure_Z
这个作者很懒,什么都没留下…
展开
-
刷题--序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树可以用前序遍历来序列化二叉树# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Sol...原创 2018-07-06 09:58:56 · 216 阅读 · 0 评论 -
刷题--孩子们的游戏(圆圈中最后剩下的数)
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数….这样下去….直到剩下最后一个小朋...原创 2018-06-07 19:56:21 · 643 阅读 · 0 评论 -
刷题--表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”, “5e2”, “-123”, “3.1416”和”-1E-16”都表示数值。 但是”12e”, “1a3.14”, “1.2.3”, “+-5”和”12e+4.3”都不是。基本思路:考虑这些数值的特征。 1.符号位,只能出现在第一位或者e(E)后一位 2.e(E),前面必须有数字,不能在最后一位 3....原创 2018-06-14 09:45:40 · 180 阅读 · 0 评论 -
刷题--正则表达式匹配
请实现一个函数用来匹配包括’.’和’*’的正则表达式。模式中的字符’.’表示任意一个字符,而’*’表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配基本思路:根据模式中第二个字符是不是”*”分两种情况讨论。 如果模式中第二个字符不是”*”: 1...原创 2018-06-14 09:24:05 · 452 阅读 · 0 评论 -
刷题--扑克牌顺子
LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…..LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌...原创 2018-06-06 17:12:22 · 195 阅读 · 0 评论 -
刷题--和为S的两个数字&和为S的连续正数序列
1.输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。基本思路:设置一前一后两个指针往内逼近。# -*- coding:utf-8 -*-class Solution: def FindNumbersWithSum(self, array, tsum): # write code h...原创 2018-05-30 20:53:43 · 178 阅读 · 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]。不能使用除法。基本思想:分两段算。构建一个矩阵,主对角线上全是1,B[i]即为矩阵第i行所有元素的乘积。# -*- coding:utf-8 -*-class Solution: def multiply(se...原创 2018-06-13 10:01:35 · 201 阅读 · 0 评论 -
刷题--两个链表的第一个公共结点
输入两个链表,找出它们的第一个公共结点。基本思想:如果两个链表有公共结点,那么从第一个公共结点开始,之后他们所有的结点都是重合的。找到对齐的位置。# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Nonecla...原创 2018-05-24 19:38:34 · 191 阅读 · 0 评论 -
刷题-- 数组中重复的数字
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路一:利用哈希表。# -*- coding:utf-8 -*-class Solution: # 这里要特别注...原创 2018-06-12 09:25:31 · 252 阅读 · 0 评论 -
刷题--数组中只出现一次的数字
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。第一想法是用哈希表,但其实浪费了空间。 我们可以利用异或运算的特性,任何一个数字异或自己都等于0。先考虑如果一个数组中只有一个数字只出现一次,那么只要从头到尾依次异或数组中的每一个数字就能得到那个只出现了一次的数字。在这个问题里,我们可以把原始数组分成两个子数组,使得每个子数组包含一个只出现一次的数字...原创 2018-05-29 10:17:24 · 203 阅读 · 0 评论 -
刷题--左旋转字符串&翻转单词顺序列
1.汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!其实python一句话就搞定了# -*- coding:utf-8 -*-class Sol...原创 2018-06-05 09:42:40 · 358 阅读 · 0 评论 -
刷题--数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。用类似归并排序的思路。# -*- coding:utf-8 -*-class Solution: def InversePairsCore(self, data, copy, s...原创 2018-05-24 09:34:27 · 197 阅读 · 0 评论 -
刷题--求1+2+3+...+n
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。基本思路:既然题目要求不能用循环,那就只能用递归了,关键在于如何描述递归结束条件,这里用到了逻辑与的短路特性。# -*- coding:utf-8 -*-class Solution: def Sum_Solution(self, n):...原创 2018-06-10 22:01:04 · 658 阅读 · 0 评论 -
刷题--不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。基本思想:既然不能用四则运算,那么只剩下位运算了。第一步不考虑进位,对每一位相加,等同于异或。接着考虑第二步进位,等同于位与运算。第三步相加的过程依旧是重复前面两步,直到不产生进位为止。# -*- coding:utf-8 -*-class Solution: def Add(self, num1,...原创 2018-06-11 09:45:38 · 234 阅读 · 0 评论 -
刷题--机器人的运动范围
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?基本思路:判断当前位置是否满足条件,然后向上下左右扩...原创 2018-07-12 10:51:00 · 323 阅读 · 0 评论 -
刷题--矩阵中的路径
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个...原创 2018-07-11 20:28:41 · 259 阅读 · 0 评论 -
刷题--把二叉树打印成多行
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。在层序遍历的基础上考虑如何区分每一行,可以设置两个变量,一个记录当前层还没有打印的结点个数,一个记录下一层需要打印的结点个数。# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# ...原创 2018-07-05 09:39:29 · 216 阅读 · 0 评论 -
刷题--按之字形顺序打印二叉树
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。可以与层序遍历二叉树类比。 这里需要使用两个栈,一个存放奇数行,一个存放偶数行。# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# sel...原创 2018-07-04 09:20:23 · 268 阅读 · 0 评论 -
刷题--滑动窗口的最大值
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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,1}, ...原创 2018-07-10 11:23:45 · 332 阅读 · 0 评论 -
刷题--对称的二叉树
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right ...原创 2018-07-03 09:38:39 · 187 阅读 · 0 评论 -
刷题--数据流中的中位数
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。其实我们不需要整个数据容器是有序的,可以把它分成两个部分,位于容器左边部分的数据比右边的数据小。设置两个指针,一个指向左边最大的数,一个指向右边最小的数,很显然,我们应该用堆来实现这两部分数据的存储。 一些细...原创 2018-07-09 14:54:47 · 375 阅读 · 0 评论 -
刷题--二叉树的下一个结点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。基本思路: 1.二叉树为空,返回空。 2.该结点存在右子树,返回右子树最左边的结点。 3.该结点不是根结点,如果该结点是其父结点的左孩子,返回其父结点;否则继续向上找父结点,重复之前的判断,返回结果。# -*- coding:utf-8 -*-#...原创 2018-07-02 09:56:06 · 218 阅读 · 0 评论 -
刷题--删除链表中重复的结点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5基本思路:运用三个指针。# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# ...原创 2018-07-01 17:01:01 · 179 阅读 · 0 评论 -
刷题--二叉搜索树的第k个结点
给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。基本思路:一个中序遍历的问题。# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self...原创 2018-07-08 10:58:57 · 272 阅读 · 0 评论 -
刷题-- 链表中环的入口结点
一个链表中包含环,请找出该链表的环的入口结点。思路一:使用一前一后两个指针,两个指针相差n步,n代表环中结点的数目,这两个指针相遇的结点刚好是环的入口。如何得到环中结点的数目?使用一快一慢两个指针,如果这两个指针相遇,表明链表中存在环,并且相遇的结点一定在环内,可以从这个结点出发,一边走一边计数。 思路二:使用一快一慢一两个指针,如果两个指针相遇,将快指针指向链表头部,慢指针位置不变,快慢指...原创 2018-06-30 17:22:48 · 195 阅读 · 0 评论 -
刷题--字符流中第一个不重复的字符
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。思路:使用哈希表。 1.可以用哈希表存储每个字符出现的次数,找到第一个次数为1的字符。如何找到第一个?可以遍历字符串,也可以利用队列。 2.可以用哈希表存储每个字符所在的位置,如果...原创 2018-06-30 17:02:02 · 237 阅读 · 0 评论 -
刷题-- 平衡二叉树
输入一棵二叉树,判断该二叉树是否是平衡二叉树。基本思想:递归。# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: ...原创 2018-05-26 15:58:57 · 1210 阅读 · 0 评论 -
刷题--数字在排序数组中出现的次数
统计一个数字在排序数组中出现的次数。既然输入的数组是排序的,那么我们很自然地可以想到用二分查找算法。我们可以先用二分查找算法找到一个k,然后在找到的k的左右两边顺序扫描。因为要查找的数字在长度为n的数组中有可能出现了n次,所以顺序扫描的时间复杂度是O(n)。这样和直接扫描整个数组进行统计的效率是一样的,显然并不好。 如何更好地利用二分查找算法… 我们可以利用二分查找算法确定第一个k和最后一...原创 2018-05-26 11:31:13 · 220 阅读 · 0 评论 -
刷题--复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)第一反应:分两步。第一步考虑next,第二步考虑random。利用哈希表建立映射关系。# -*- coding:utf-8 -*-# class RandomListNode:...原创 2018-05-09 20:14:09 · 212 阅读 · 0 评论 -
刷题--栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)基本思路:建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并按照第二个序列的顺序依次从...原创 2018-05-03 09:24:56 · 174 阅读 · 0 评论 -
刷题--链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点。 基本思想:定义两个指针。第一个指针从链表的头结点开始遍历向前走k-1,第二个指针保持不动;从第k步开始,第二个指针也开始从链表的头结点开始遍历。由于两个指针的距离保持在k-1,当第一个指针到达链表的尾结点时,第二个指针正好是倒数第k个结点。 考虑链表为空,链表结点总数少于k,k非正。# -*- coding:utf-8 -*-# class...原创 2018-04-20 10:23:11 · 170 阅读 · 0 评论 -
刷题--调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。如果没有最后那个条件,我们可以用类似快排的思想解决这个问题。 感觉自己被快排的思想限制住了,总想着交换,然后就写出了下面的代码。 时间复杂度应该达到了O(N2)。# -*- coding:utf-8 -*-clas...原创 2018-04-19 12:29:30 · 227 阅读 · 0 评论 -
刷题--树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Nonecla...原创 2018-04-23 09:50:12 · 142 阅读 · 0 评论 -
刷题--数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。考虑指数的正负,底数是否为0等情况。0的0次方在数学上是没有意义的,因此无论输出0还是1都是可以接受的。 当指数为负数时,我们可以先对指数求绝对值,然后算出次方的结果之后再取倒数。特殊情况:底数为0,指数为负,0不能作为除数。 假设我们的目标是求出一个数字的32次方,如果我们已经知...原创 2018-04-18 11:10:27 · 202 阅读 · 0 评论 -
刷题--合并两个排序的链表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 递归版本:class Solution: # 返回合并后列表 def Merge(self, pHead1, pHead2): # write code here if pHead1 == None: return pH...原创 2018-04-22 10:22:49 · 164 阅读 · 0 评论 -
刷题--用两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。我一开始的想法是每次要出队列的时候,将栈1中的元素全部出栈到栈2,栈顶即是要出队列的元素,然后再将栈2的元素全部出栈回栈1。这样操作时间复杂度略高。 更为简洁的办法是当栈2为空时,栈1全部出栈到栈2,栈2只用来出队列。# -*- coding:utf-8 -*-class Stack: de...原创 2018-04-12 14:47:24 · 177 阅读 · 0 评论 -
刷题--二进制中1的个数
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路一:将整数和1做位与运算,如果结果为1则代表此时整数最右边一位是1。然后将整数右移一位。 这种做法在C++里会引起死循环,因为负数右移的时候左边用符号位1补位,最终数字会变成0xFFFFFFFF。但是在Python里好像不会,略费解。 思路二:为了避免死循环,我们可以不右移整数,改为左移1。这样做在Python里反而会死循...原创 2018-04-17 10:07:40 · 191 阅读 · 0 评论 -
刷题--重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路:前序序列的第一个数字是根节点的值,在中序序列中找到根节点的值,确定左右子树,分别递归。# -*- coding:utf-8 -*-# class...原创 2018-04-11 15:15:45 · 189 阅读 · 0 评论 -
刷题--替换空格
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。这个问题如果用python来解就很简单了,一行代码就搞定,直接调replace函数,或者先split再join。这样好像太草率了,还是贴出常规思路吧,这里使用C++。 基本思想:从后往前插入。class Solution {pub...原创 2018-04-10 10:46:40 · 184 阅读 · 0 评论 -
刷题--旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。旋转之后的数组实际上可以划分为两个排序的子数组,且前面的子数组的元素都大于或者等于后面子数组的元素。最小的元素恰好是这...原创 2018-04-14 14:49:58 · 165 阅读 · 0 评论