
剑指offer
文章平均质量分 84
wenlyq
这个作者很懒,什么都没留下…
展开
-
第一个只出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).思路java将字符串转换为字符数组,判断第一次出现的索引和最后一次的索引是否一致public class Solution { public int FirstNotRepeatingChar(String str...原创 2019-07-14 13:18:42 · 104 阅读 · 0 评论 -
求1+2+3+...+n
思路:递归:退出条件n=0思路二:等差数列公式,pow(x,y) :除2用右移# -*- coding:utf-8 -*-class Solution: def Sum_Solution(self, n): # write code here if n==0: return 0 return n+self.Su...原创 2019-03-26 15:30:18 · 261 阅读 · 0 评论 -
对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:定义一个比较函数比较左右子树1.左子树为空,返回右子树是否为空2.右子树为空,返回false3.左右节点的值不同,返回false4.递归比较 左子树的右子树和右子树的左子树 and 右子树的左子树和左子树的右子树# -*- coding:utf-8 -*-#...原创 2019-03-29 21:36:46 · 77 阅读 · 0 评论 -
?*二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:1.空,返回空2.该节点存在右子节点,则指针指向该节点的右子节点,循环判断右子节点的左节点,直到左子节点为空3.该节点不存在右子节点,循环条件(该节点的下一个节点不为空)创建一个根节点(指向该节点的下一个节点),若该节点为根节点的左子节点,返...原创 2019-03-29 21:15:14 · 192 阅读 · 0 评论 -
删除链表中重复的结点
题型1 删除重复的节点,重复的节点不保留题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5需要考虑第一个节点重复的情况,所以创建一个头节点,保证头节点不会重复,头节点指向head,两个指针,pre 和current...原创 2019-03-29 20:31:35 · 150 阅读 · 0 评论 -
链表中环的入口结点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。1:判断链表是否带环:判断有环的方法就是用两个快慢指针p1、p2,p1的速度为P2的两倍,两个指针同时从链表的头结点开始出发,当两个结点再一次相遇且相遇点不是最后一个结点时,说明此链表有环。2:、若有环,找环的入口:①当P1和P2在PM相遇时:P1走过的路程(结点数):S快=L+X+n*R;P2走过...原创 2019-03-29 19:14:33 · 129 阅读 · 0 评论 -
和为S的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正数序列。序...原创 2019-03-22 20:21:09 · 82 阅读 · 0 评论 -
平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路:平衡二叉树:二叉树的左右子树距离不超过1递归:超过1,False不超过1,左右子树都判断# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None...原创 2019-03-22 19:17:18 · 82 阅读 · 0 评论 -
二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:递归:左树右树的深度最大值+1# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left =...原创 2019-03-22 18:31:02 · 80 阅读 · 0 评论 -
表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。思路:主要判断 数字、小数点、e/E、+/-1.+/-:第一次出现只能在句首或者e/E后面;第二次出现只能e/E后面2.e/E:只能出现一...原创 2019-03-29 16:23:53 · 84 阅读 · 0 评论 -
孩子们的游戏(圆圈中最后剩下的数)
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一...原创 2019-03-25 17:47:57 · 96 阅读 · 0 评论 -
扑克牌顺子
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张...原创 2019-03-25 15:39:26 · 108 阅读 · 0 评论 -
翻转单词顺序列
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路 split()成列...原创 2019-03-25 14:54:44 · 73 阅读 · 0 评论 -
不用加减乘除做加法
二进制值相加:第一步:两个数异或:相当于每一位相加,而不考虑进位;第二步:两个数相与,并左移一位:相当于求得进位;第三步:重复上述两步,直到进位值为0,跳出循环。# -*- coding:utf-8 -*-class Solution: def Add(self, num1, num2): # write code here while num2!...原创 2019-03-26 15:42:20 · 80 阅读 · 0 评论 -
数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路:因为找出任意一个即可,所以可以对数组,排序,然后比较相邻的两个,相同则赋值并返回# -*- coding:utf-...原创 2019-03-27 09:13:50 · 92 阅读 · 0 评论 -
字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。思路:创建一个列表插入:对于字符,如果不在列表中,就插入;在列表中则remove(item)返回值:如果列...原创 2019-03-28 22:15:34 · 115 阅读 · 0 评论 -
正则表达式匹配
题目描述请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配思路:递归退出条件:相等匹配;pattern先结束其他:pattern长度大于1判断 patt...原创 2019-03-28 10:40:17 · 117 阅读 · 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...原创 2019-03-31 20:26:34 · 95 阅读 · 0 评论 -
数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。思路:初始化类时创建一个data存放插入的数据,可全局使用# -*- coding:utf-8 -*-...原创 2019-03-31 19:49:25 · 153 阅读 · 0 评论 -
二叉搜索树的第k个结点
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值...原创 2019-03-31 19:10:25 · 175 阅读 · 0 评论 -
??序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树序列化:就是遍历输出,采用前序遍历反序列化:根据序列,构造出二叉树所谓序列化指的是遍历二叉树为字符串;依据前序遍历序列来序列化二叉树,因为前序遍历序列是从根结点开始的。当在遍历二叉树时碰到Null指针时,这些Null指针被序列化为一个特殊的字符“#”。 另外,结点之间的数值用逗号隔开。所谓反序列化指的是依据字符串重新构造成二叉...原创 2019-03-31 18:16:12 · 376 阅读 · 0 评论 -
把二叉树打印成多行
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。类似上一题思路:利用层次遍历,但加入本层levelque和下一层nextlevel,res存放最终值1.根节点加入levelque中2.while leveque:针对每层创建一个nextlevel(存入左子树和右子树),curvalue存放当前层的值3.然后将curvalue加入res中,nextlevel给le...原创 2019-03-31 15:53:27 · 97 阅读 · 0 评论 -
按之字形顺序打印二叉树
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:利用层次遍历,但加入本层levelque和下一层nextlevel,加入righttoleft判断是否需要逆序,res存放最终值1.根节点加入levelque中2.while leveque:针对每层创建一个nextlevel(存入左...原创 2019-03-31 15:38:56 · 83 阅读 · 0 评论 -
左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!# -*- coding:utf-8 -*-class Solution: def Le...原创 2019-03-24 15:47:27 · 76 阅读 · 0 评论 -
和为S的两个数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。思路:a+b=sum,a,b相差越远,乘积越小,分别从头尾遍历比较,找到则break如果>,则右指针-1如果<,则左指针+1# -*- coding:utf-8 -*-class So...原创 2019-03-24 15:25:31 · 84 阅读 · 0 评论 -
数组中只出现一次的数字
一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。思路:遍历,创建字典存放次数然后输出为1的# -*- coding:utf-8 -*-class Solution: # 返回[a,b] 其中ab是出现一次的两个数字 def FindNumsAppearOnce(self, array): # write cod...原创 2019-03-24 14:59:01 · 89 阅读 · 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]。不能使用除法。思路:B[I]没有A[i]两层循环,当j==i时不计算跳过此次循环,其他累乘# -*- coding:utf-8 -*-class Solution: def multiply(self, A):...原创 2019-03-27 09:59:46 · 129 阅读 · 0 评论 -
丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路:每一个丑数必然是由之前的某个丑数与2,3或5的乘积得到的,这样下一个丑数就用之前的丑数分别乘以2,3,5,找出这三这种最小的并且大于当前最大丑数的值,即为下一个要求的丑数。取对应的最小之后,inde...原创 2019-03-12 21:51:46 · 143 阅读 · 0 评论 -
把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。python思路:转换成字符串+比较大小,交换字符串位置,然后遍历输出字符串# -*- coding:utf-8 -*-class Solution: def PrintMinNumber(self,...原创 2019-03-12 21:28:12 · 93 阅读 · 0 评论 -
整数中1出现的次数(从1到n整数中1出现的次数)
题目描述求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。思路:将数转换成整个字符串,统计字符串中1的个数# -*- coding:...原创 2019-03-12 20:40:22 · 132 阅读 · 0 评论 -
斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39F[1]=1,F[2]=1,F[n]=F[n-1]+F[n-2]思路一:递归,时间太长注意:从索引0开始,但0时为0;1或2时都为1# -*- coding:utf-8 -*-class Solution: def Fibonacci(self, n)...原创 2019-02-26 19:36:51 · 218 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路:递归# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.va...原创 2019-03-05 10:14:53 · 73 阅读 · 0 评论 -
旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:查找数组最小值# -*- coding:utf-8 -*-class Solution: de...原创 2019-02-25 21:22:16 · 154 阅读 · 0 评论 -
用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:栈后进先出;队列先进先出栈1用来插入;栈2用来出元素,栈2为空时,栈1pop插入栈2,栈2再pop实现反转,先进先出申请两个栈Stack1和Stack2,Stack1当作输入,Stack2当作pop。当Stack2空的时候,将Stack1进行反转,并且输入到Stack2。# -*- codi...原创 2019-02-25 20:40:50 · 100 阅读 · 0 评论 -
重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路一:找到中序中根节点所在位置,分为左子树,右子树递归调用重建# -*- coding:utf-8 -*-# class TreeNode:# ...原创 2019-02-25 19:57:51 · 124 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路一:非递归左子树一定比右子树小,因此去掉根后,数字分为left,right两部分,right部分的最后一个数字是右子树的根,他也比左子树所有值大,因此我们可以每次只看右子树是否符合条件即可。即使到达了左子树,左子树也可以看出由左右子树组成的树...原创 2019-03-04 21:32:43 · 114 阅读 · 0 评论 -
合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。递归:注意链表为空的情况;# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution...原创 2019-02-28 21:58:02 · 110 阅读 · 0 评论 -
反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。思路一:非递归*head为空时,直接返回null;*head为当前结点,pre为当前结点的前一结点,next为当前结点的下一结点。*pre结点可以反转指向,但反转之后如果不用next结点保存next结点的话,链表就断开了*循环:先用next保存下一个结点的信息,保证单链表不会因为失去head结点的原next结点而就此断裂;保存完n...原创 2019-02-28 21:40:10 · 87 阅读 · 0 评论 -
链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。思路一:*两个指针fast和slow,让两个指针都指向头结点;*让fast走(k-1)步(1~k-1),到达第k个节点;*两个指针同时往后移动,当fast到达末尾的时候,slow所在位置就是倒数第k个结点注意 head为空,k<=0;以及节点.next 为空的判断/*public class ListNode { in...原创 2019-02-28 21:15:33 · 97 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。思路一:创建一个list,将链表值加入;然后反转输出python# -*- coding:utf-8 -*-class ListNode: def __init__(self, x): self.val = x self.next = Noneclass Solution...原创 2019-02-24 21:21:03 · 94 阅读 · 0 评论