剑指offer
小白的进阶之路
努力
展开
-
leetcode128 Longest Consecutive Sequence(最长连续序列)
题目要求给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。解题思路首先拿到题目可以想到暴力法,依次去遍历判断可以得到答案,但是实际复杂度太高,不适用。 还有一种是先排序,然后根据排序后的结果一次遍历就可以得到结果。同暴力法一样,不是最优的解法,所以也不建议使用。综上,我们使用一种方法,借用python中的set结构,首先用这结构的好处是让我们去除了冗余...原创 2019-07-29 15:44:16 · 375 阅读 · 0 评论 -
【剑指offer】面试题57 和为S的两个数字
题目要求输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。对应每个测试案例,输出两个数,小的先输出。解题思路我们能马上想到固定一个数,然后依次遍历数组中的剩余数字,在O(n2)的时间复杂度,解出题目。但是由于时间复杂度过高,缺乏算法技巧,可能不足以让我们通过面试,实际上本题也是一类典型题,观察题目发现是一个增序数...原创 2019-03-08 22:22:11 · 164 阅读 · 0 评论 -
【剑指offer】面试题56 数组中只出现一次的数字
题目要求一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。解题分析仔细看题目中强调的只有两个数字是出现了一次,这样说明,我们可以用异或运算来进行解题,典型的套路!因为任何数字和自身异或等于0。根据剑指offer上的解题思路,首先我们先对数组中的所有元素进行异或运算,根据得到的结果,我们能知道这个结果的二进制形式中右边第一个1的位置,然后根据这个位置...原创 2019-03-08 21:51:17 · 169 阅读 · 0 评论 -
【剑指offer】面试题53 在排序数组中查找数字
题目要求统计一个数字K在排序数组中出现的次数。题目分析看到排序数组进行搜索查找工作,马上想到我们要使用“二分查找法”!相对于剑指offer书中给出的解法,找到第一个数字的位置和最后一个数字的位置,然后用他们相减即可。 在这里,我们根据评论区各种大佬的解答,总结一个新的方法,实际上由于数组中存放的都是整数,所以我们可以把这道题转换成找到K+0.5在数组中插入的位置,和K-0.5在数组中插入的位...原创 2019-03-05 23:18:02 · 330 阅读 · 0 评论 -
【剑指offer】面试题40 最小的K个数
题目要求输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector<int&a原创 2019-02-20 23:12:20 · 182 阅读 · 0 评论 -
【剑指offer】面试题39 数组中出现次数超过一半的数字
题目要求数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。题目分析影响输出的是两个元素,一个是数字,一个是次数主要代码c++class Solution {public: int MoreThanHalfNum_Solu...原创 2019-02-20 22:55:24 · 337 阅读 · 0 评论 -
【剑指offer】面试题36 二叉搜索树与排序链表
题目要求输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 输出链表的”头节点“。解题分析二叉搜索树和排序链表有什么关系?二叉搜索树也是一种排序的数据结构,所有的左子节点的值都小于根结点的值,所有右子节点的值都大于根节点的值。那我们可以根据这个特性吧BST转换成排序的双向链表。我们只要把原先指向左孩子节点的指针调整为链表中指向...原创 2019-02-19 21:54:40 · 240 阅读 · 0 评论 -
【剑指offer】面试题38 字符串的排列
题目要求输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。注意输出顺序,可以输入含有重复元素的字符串解题分析对有多少种字符的排列,我们应该一下无法直观的想到解决办法。不如,我们先把一个字符串看成两部分:第一个字符,以及除了第一个字符之外的其余字符。A,XXXXXXX...原创 2019-02-19 20:44:00 · 226 阅读 · 0 评论 -
【剑指offer】面试题50 第一个只出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).解题分析我们能想到最容易的办法就是用当前字符依次的和后边的字符进行比较,如果没有重复的那么就是我们想要的结果,但是这样比较的时间复杂度是O(n2)。不足以AC。因为题目可以转化为每个字符出现的次数,那么我们是不是可选一个容...原创 2019-02-23 17:05:40 · 148 阅读 · 1 评论 -
【剑指offer】面试题37 序列化二叉树
题目要求请实现两个函数,分别用来序列化和反序列化二叉树解题分析/*对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的结点不为空时,在转化val所得的字符之后添加一个’ , '作为分割。对于空节点则以 ‘#’ 代替。对于反序列化:按照前序顺序,递归的使用字符串中的字符创建一个二叉树(特别注意:在递归时,递归函数的参数一定要是char ** ,这样才能保证每次递...原创 2019-02-12 18:18:43 · 201 阅读 · 0 评论 -
【剑指offer】面试题32(3) 按之字形顺序打印二叉树
有关剑指offer题目的解析:剑指offer 题目整理题目要求请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。如: 1 / \ 2 3/ \ / \4 5 6 7打印顺序:13 24 5 6 7 解题分析有了从上到下打印二叉树 ,把二叉树打印...原创 2019-02-12 17:48:51 · 301 阅读 · 0 评论 -
【剑指offer】面试题32(2) 把二叉树打印成多行
有关剑指offer题目的解析:剑指offer 题目整理题目要求从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。如: 1 / \ 2 3/ \ / \4 5 6 7打印顺序:12 34 5 6 7 解题分析和【剑指offer】面试题32 从上到下打印二叉树一样,只不过不同的是要把每一层的元素单独存放在一个vector中,最后...原创 2019-02-12 17:44:23 · 298 阅读 · 0 评论 -
【剑指offer】面试题49 丑数
题目要求把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解题分析首先我们能想到的方法就是,循环遍历,对每一个数字进行判断,如果是丑数那么数量加一,直到等于N的时候,返回。但是如此计算有一个很大的问题就是,每一个数字都需要计算一次,即使这个数不是丑数,所以计算消...原创 2019-02-23 11:28:35 · 187 阅读 · 0 评论 -
【剑指offer】面试题52 链表的公共节点
题目要求输入两个链表,找出它们的第一个公共结点。解题思路相对于判断两个不同长度的链表,我们更喜欢判断同样长度的链表中的异同。那么如果输入是不同长度的我们怎么处理呢? 这里边说一个常用的方法,就是组合链表1和链表2 即 l1+l2 = l2 + l1 (l1,l2分别是链表1和链表2的长度)根据这个分析方法,我们能写出以下是代码,分别遍历链表1和链表2,当表1到末尾时去遍历表2,当表二到...原创 2019-02-27 20:58:26 · 166 阅读 · 0 评论 -
【剑指offer】面试题51 数组中的逆序对
class Solution {public: int InversePairs(vector<int> data) { int size = data.size(); if(size == 0) return 0; vector<int>copy(size); for(int i=0;i&l原创 2019-02-27 20:15:39 · 256 阅读 · 0 评论 -
【剑指offer】面试题64 求1+2+3+...+n
题目要求求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解题分析求1+2…+n除了用公式n*(n+1)/2,无外乎循环和递归两种思路。但是循环不能使用,所以我们想办法用递归解决,但是递归也需要一个递归结束的条件,也需要判断但是没有条件,我们只能想到用短路特性来做。短路特性a&&b 如...原创 2019-03-13 22:24:01 · 336 阅读 · 0 评论 -
【剑指offer】面试题55 二叉树的深度
问题描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解题分析根据深度的描述,我们可以直接借鉴深度优先遍历的方法,分别计算左子树和右子树的深度,然后取其较大的一个再加上根的长度(1)即可,具体代码可以参考下文的DFS。还有一个比较好理解的方法就是基于层序遍历实现的,因为二叉树的深度等于其层数,所以借助队列进行层序遍历...原创 2019-03-06 22:06:58 · 353 阅读 · 0 评论 -
【剑指offer】面试题63 股票的最大盈利
题目要求假设把某股票的价格按照时间先后顺序存储到数组中,请问买卖该股票一次可能获得的最大利润是多少?如[9,11,8,5,7,12,16,14],如果我们在价格5时买入,那么再价格为16时候卖出,则能收获的最大利润是11。解题分析实际上算最大利润就是整个数组中,元素对的最大差值,有了这个概念,我们可以用暴力法直接两个循环遍历即可,但是时间复杂度太高0(n2)。实际上这是一些典型的习题,我们...原创 2019-03-13 20:48:20 · 248 阅读 · 0 评论 -
【剑指offer】面试题62 圆圈中最后剩下的数字
题目要求0,1,…n-1这n个数字排成一个圈,从数字0开始,每次从这个圆圈里删除第m个数字,求这个圆圈里剩下的最后一个数字。解题分析书中给出了一个经典的环形链表的解题方法,但是在n数字较大的时候,你会发现,再环中的很多数字都会被多次重复遍历,并且需要一个辅助链表来进行操作。所以,使用环形链表解题经典并不高效。实际上,这是一个典型的约瑟夫环问题,有关约瑟夫环知识可以参照这篇博客的讲解,讲的很...原创 2019-03-12 17:54:50 · 530 阅读 · 0 评论 -
【剑指offer】面试题61 扑克牌顺子
题目要求一副扑克牌,里面有2个大王,2个小王,随机从中抽出了5张牌,看看能不能抽到顺子,所谓顺子就是五个连续的数字,如1,2,3,4,5。为了方便测试其中大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。现在,要求你使用这幅牌模拟上面的过程,如果随机抽出的牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。解题思路根据题目的介绍,我...原创 2019-03-12 17:39:15 · 203 阅读 · 0 评论 -
【剑指offer】面试题41 数据流中的中位数
面试题–【剑指Offer】 题目解答题目要求如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。解题分析这道题我们用最大堆,最小堆来实现。需要注意的是1、两个...原创 2019-03-16 23:45:39 · 221 阅读 · 0 评论 -
【剑指offer】面试题58-2 左翻转单字符串
题目要求汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!题目分析有了第58题分析的思路【剑指offer】面试题58 翻转单词顺序列,我们可以这么来解决,...原创 2019-03-11 22:19:49 · 149 阅读 · 0 评论 -
【剑指offer】面试题59 滑动窗口的最大值
题目要求给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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-11 21:48:53 · 292 阅读 · 0 评论 -
【剑指offer】面试题66 构建乘积数组
题目要求给定一个数组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]。不能使用除法。解题分析简单的蛮力法,使用两次for进行连乘可以完成目的,但是时间复杂度太高O(n2)我们把B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]分成两部分,一部分是A[0]A[1]…A[i...原创 2019-03-19 22:36:52 · 129 阅读 · 0 评论 -
【剑指offer】面试题55-2 平衡二叉树
题目要求输入一棵二叉树,判断该二叉树是否是平衡二叉树。平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树解题分析基于第55题【剑指offer】面试题55 二叉树的深度的基础,我们可以分别求出左右子树的深度,然后判断...原创 2019-03-07 21:24:50 · 439 阅读 · 0 评论 -
【剑指offer】面试题54 二叉搜索树的第k个结点
题目要求给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。解题思路这里边有一个我们需要的知识:二叉搜索树按照中序遍历的结果就是一个递增的序列形式。所以根据这个知识,我们只要按照中序遍历的思想,设置一个计数器就可以顺利的找到第k个小的节点了,这里有个大坑,就是返回的是节点!!!!不是节点的值,如果是节点的值...原创 2019-03-07 20:03:36 · 241 阅读 · 0 评论 -
【剑指offer】面试题65 不用加减乘除做加法
面试题–【剑指Offer】 题目解答题目要求写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。解题分析既然不能用运算符号,那么我们只能用位运算来进行解决。我们根据十进制的结果来转换到二进制。·····················································································...原创 2019-03-14 23:15:34 · 170 阅读 · 0 评论 -
【剑指offer】面试题67 把字符串转换成整数
面试题–【剑指Offer】 题目解答题目要求将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。解题分析其实字符串转化成数字的关键步骤大家都知道:res=res∗10+str[i]−′0′res = res*10 + str[i...原创 2019-03-14 22:57:45 · 325 阅读 · 0 评论 -
【剑指offer】面试题3 数组中的重复元素
题目要求在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。解题分析使用蛮力法,高额的时间代价是我们得不偿失的,还可以想到使用哈希表,通过构建辅助数组,然后遍历一遍数组的元素即可,...原创 2019-03-14 21:29:39 · 185 阅读 · 0 评论 -
【剑指offer】面试题58 翻转单词顺序列
题目要求输入一个句子,例如“I am a student.”,反转句子中单词的顺序,标点和字母处理方式一样, 但单词内的字符顺序不变,输出反转后的结果,如“student. a am I”。解题分析不同于书上的官方解法,在这里我们巧妙地利用字符串的相加和空格的判断来达到字符串反转的效果!比较 “I am a student.” 和 “student. a am I”, 你会发现实际上就是把...原创 2019-03-10 17:41:45 · 165 阅读 · 0 评论 -
【剑指offer】面试题57-2 和为S的连续正数序列
题目要求小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!解题分析有了面试题57的基础【剑指offe...原创 2019-03-10 16:42:22 · 292 阅读 · 0 评论 -
【剑指offer】面试题45 把数组排成最小的数
题目要求输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323解题分析首先我们能想到最直接的办法就是对给出的数字进行全排列,然后依次比较,选出最小的数。但是时间复杂度太大,不会通过。/*对vector容器内的数据进行排序,按照 将a和b转为string后 若 a+b&l...原创 2019-02-22 23:03:11 · 139 阅读 · 0 评论 -
【剑指offer】面试题43 整数中1出现的次数(从1到n整数中1出现的次数)
题目要求求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。...原创 2019-02-22 22:41:03 · 208 阅读 · 0 评论 -
【剑指offer】面试题26 树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解题分析判断是否为子结构根据定义我们可以分成两部分:1、第一步,在树A中寻找到和树B的根节点一样的节点R2、第二步,判断在树A中以R为根节点的子树是不是包含树B一样的结构我们采用递归的策略去查找根节点和其相同的子结构,具体的实现步骤结合下面的代码体会一下。主要代码c++/*struc...原创 2019-02-07 21:20:21 · 299 阅读 · 0 评论 -
【剑指offer】 面试题25 合并两个排好序的链表
题目要求输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路一定要弄清合并的过程,防止中间出现断链的过程。主要步骤:(1)首先,对于两个递增的序列,我们从头节点开始比较,两个链表中节点值小的作为头节点,假设链表1的头节点较小,pMergedHead = pHead1.(2)那么然后我们依次比较链表1中除头节点以外的点和链表2中的全部点,方...原创 2019-02-06 23:08:59 · 528 阅读 · 0 评论 -
【剑指offer】 面试题24 翻转链表
题目要求输入一个链表,反转链表后,输出新链表的表头解题思路要想反转链表,我们要做的就是,把当前节点的后继指向该点的前驱,然后一直重复迭代到结束。这里边有两个关键的点:1、如何指向节点的前驱。(用一个指针记录前驱结点)2、如何保证链表不被截断。(用一个指针在操作前先记录后继节点)为保证程序的健壮性,也要考虑输入为空,和只有一个节点的情况。主要代码c++/*struct ListNo...原创 2019-02-06 23:08:32 · 216 阅读 · 0 评论 -
【剑指offer】 面试题23 链表中环的入口节点
题目要求给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。解题思路经过思考我们发现,解题分成了两个步骤:1、判断链表是否有环,有环的话进行第2步,否则返回空。2、寻找环的入口。答:第一个问题很好解决,根据面试题22的启发,我们可以使用快慢指针,快的每次走两步,慢的每次走一步,如果某个时刻,快指针和慢指针相遇则有环。 难点是第二个问题如何求解,根据下面这个图借鉴思...原创 2019-02-06 23:07:36 · 269 阅读 · 0 评论 -
【剑指offer】 面试题22 链表中倒数第k个结点
题目要求输入一个链表,输出该链表中倒数第k个结点。解题分析我们可以用两次遍历解决问题,第一次遍历是统计链表中的节点个数,第二次找到倒数第k个点。但是这样需要我们两次遍历链表,通常情况下,面试官需要我们一次遍历解决问题,所以有没有更好的方法?这时候我们需要两个指针同时完成任务,第一个指针从头遍历k-1步同时第二个指针不动,从第k步开始,两个指针同时遍历,直到第一个指针到达尾部,第二个指针刚好...原创 2019-02-06 17:51:50 · 253 阅读 · 0 评论 -
【剑指offer】 面试题19 正则表达式匹配
题目要求题目描述请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和&原创 2019-02-06 16:11:49 · 160 阅读 · 0 评论 -
【剑指offer】 面试题20:表示数值的字符串
题目要求请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和&qu原创 2019-02-03 23:49:28 · 511 阅读 · 0 评论