jianzhioffer
ippputeeel
这个作者很懒,什么都没留下…
展开
-
剑指offer29 -- 数组中重复的数字
题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。解题思路:因为数组的长度为n,如果没有重复每个数与其下标相同,如果该下标已经相同了,则说明有重复。# -*...原创 2018-07-24 00:23:05 · 124 阅读 · 0 评论 -
剑指offer15 -- 第一个只出现一次的数字
题目描述:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).解题思路:第一遍扫描数组时得到hash表(每个字母的频率计数),第二遍扫描数组,每次从hash表中取出频率,第一个频率为1的即为所求。时间复杂度O(n)解答:# -*- coding:utf-8 -*-c...原创 2018-07-22 10:28:40 · 118 阅读 · 0 评论 -
剑指offer17 -- 两个链表的第一个公共结点
题目描述:输入两个链表,找出它们的第一个公共结点。解题思路:首先遍历两个链表,分别得到两个链表的长度,然后让长的链表先走diff步(diff为长度差),然后两个指针同时走,走到相同即为第一个公共结点。依据是公共部分的长度是相等的。解答:# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):...原创 2018-07-22 18:33:01 · 95 阅读 · 0 评论 -
剑指offer18 -- 数字在排序数组中出现的次数
题目描述:统计一个数字在排序数组中出现的次数解题思路:使用二分查找的方法,从数组的中点开始查找,如果中点的数大于目标,在数组左边查找;如果中点的数小于目标,在数组右边查找;如果中点的数恰好等于目标,将目标与左端点和右端点的数相比,如果左端小于目标数,继续在左端搜索;如果右端大于目标数,继续在右端搜索关键需要考虑清楚边界。# -*- coding:utf-8 -*-class...原创 2018-07-22 19:16:58 · 100 阅读 · 0 评论 -
剑指offer20 -- 平衡二叉树
题目描述:输入一棵二叉树,判断该二叉树是否是平衡二叉树。解题思路:平衡二叉树的定义:平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。递归判断:左右子树的高度差绝对值不超过1,且左右子树都是一颗平衡数...原创 2018-07-22 19:33:58 · 92 阅读 · 0 评论 -
剑指offer22 -- 和为S的连续正数序列
题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正数...原创 2018-07-23 01:01:48 · 103 阅读 · 0 评论 -
剑指offer23 -- 和为s的两个数字
题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。解题思路:一种方法就是用两个指针,因为是排序数列,一个从前,一个从后,如果和小于S,前面的指针走一步,如果和大于S,后面的指针走一步# -*- coding:utf-8 -*-class Solution: def FindNumbe...原创 2018-07-23 01:16:01 · 89 阅读 · 0 评论 -
剑指offer24 -- 左旋转字符串
题目描述:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!解题思路:对整体进行左旋以后,再部分旋转# -*- coding:utf-8 -*...原创 2018-07-23 01:26:52 · 105 阅读 · 0 评论 -
剑指offer26 -- 扑克牌顺子
题目描述:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小王可以看成任何数字,并且A看作1,J为11,Q为12,K...原创 2018-07-23 01:48:13 · 106 阅读 · 0 评论 -
剑指offer27 -- 孩子们的游戏(圆圈中最后剩下的数)
题目描述:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....原创 2018-07-23 02:05:03 · 116 阅读 · 0 评论 -
剑指offer13 -- 把数组排成最小的数
题目描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解题思路:两个数之间比较,看哪个数放在前面排成的数字较小。利用冒泡的方法,将数组排序解答:# -*- coding:utf-8 -*-class Solution: def Prin...原创 2018-07-22 00:36:40 · 162 阅读 · 0 评论 -
剑指offer11 -- 连续子数组的最大和
题目描述:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大...原创 2018-07-21 22:28:15 · 81 阅读 · 0 评论 -
剑指offer30 -- 构建乘积数组
题目描述:给定一个数组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]。不能使用除法。解题思路:运用动态规划的方法,得到前向乘积和后向乘积两个数组,每一次分别从前向和后向中取对应部分# -*- coding:utf-8 -*-class Solution...原创 2018-07-24 00:38:42 · 144 阅读 · 0 评论 -
剑指offer31 -- 字符流中第一个不重复的字符
题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。解题思路:题目的关键是字符流,需要自己定义一个数据结构存储数据流# -*- coding:u...原创 2018-07-24 00:55:58 · 99 阅读 · 0 评论 -
剑指offer1 - 包含min函数的栈
思路是同时维护两个栈,一个存放数字,一个存放min# -*- coding:utf-8 -*-class Solution: def __init__(self): self.stack = [] self.min_stack = [] def push(self, node): self.stack.append(nod...原创 2018-07-19 22:38:03 · 68 阅读 · 0 评论 -
剑指offer2 -- 栈的压入、弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路:根据栈压入和弹出的规则,要么压入就弹出,要么一定在后压入的元素之后...原创 2018-07-19 23:27:24 · 89 阅读 · 0 评论 -
剑指offer3--从上往下打印二叉树
题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。解题思路:维持一个队列,首先让根节点入队,然后对于,每一个节点,当其左右儿子入队时,该节点出队,进入打印列表。 # class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# ...原创 2018-07-19 23:37:06 · 103 阅读 · 0 评论 -
剑指offer4-- 二叉搜索树的后续遍历序列
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路:二叉搜索树的特征:左儿子<父亲<右儿子后续遍历:左子树、右子树、根根据后续遍历的规律,首先可以找到根节点,然后根据左子树上的元素都小于根节点,右子树上的元素都大于根节点,可以分别得到左子树对应的后续遍历序列和右...原创 2018-07-19 23:53:18 · 110 阅读 · 0 评论 -
剑指offer5--二叉树中和为某一值的路径
题目描述:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)解题思路:深度优先遍历,每一次遍历到叶子节点判断是否满足和为expectnumber重点是路径的存储方式,将某一节点后的路径都存储为嵌套列表。# -*- coding...原创 2018-07-20 00:08:03 · 88 阅读 · 0 评论 -
剑指offer6--复杂链表的复制
题目描述:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路:关键是需要记录每一个random指针指向的节点。这个想法很巧妙,首先在每一个节点后面插入一个节点,插入的节点值跟该节点相同,且特殊指针指向的节点也相同...原创 2018-07-20 01:11:25 · 109 阅读 · 0 评论 -
剑指offer7--二叉搜索树与双向链表
问题描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解题思路:二叉搜索树的中序遍历,同时每一次增加一个指向# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# ...原创 2018-07-20 01:30:25 · 100 阅读 · 0 评论 -
剑指offer8 -- 字符串的排列
问题描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。解题思路:回溯法# -*- coding:utf-8 -*-class Solution: def ...原创 2018-07-20 01:53:26 · 175 阅读 · 0 评论 -
剑指offer9 -- 数组出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解答:# -*- coding:utf-8 -*-class Solution: def MoreThanHalfNum_Solution(self, nu...原创 2018-07-20 01:56:59 · 109 阅读 · 0 评论 -
剑指offer10 -- 最小的k个数
题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题思路:使用快排的思路,每一次交换以后判断右边的数的个数,大于k的话在右边找最小的k个,小于k的话在左边找最小的k-r(r位右边的长度),等与k的话直接返回或者直接找partition点,如果parttion点恰好等于k-1就返回,如果大于k-1则在...原创 2018-07-21 22:19:28 · 89 阅读 · 0 评论 -
剑指offer28 -- 不用加减乘除做加法
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:使用位运算第一步不考虑进位,对每一位直接相加,1加0和0加1都等于1,0加0和1加1都等于0,这和异或的结果相同第二步考虑进位,只有1加1会产生进位,因此先按位与,结果为1的位置需要向前进1位,即<<1第三步用同样的方法将两个结果相加循环知道没有进位为止# -...原创 2018-07-23 02:24:05 · 106 阅读 · 0 评论