剑指offer刷题
剑指offer 题目
roy_blue
算法工程师,希望和大家共同提高,欢迎关注,关注必回
展开
-
【剑指offer刷题】--二叉树的下一个结点
题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。解:我们都了解了中序遍历的规则是 左 根 右# -*- coding:utf-8 -*-# class TreeLinkNode:# def __init__(self, x):# self.val =...原创 2020-03-17 16:41:27 · 151 阅读 · 0 评论 -
【剑指offer刷题】--二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解:对于二叉树深度的求解可以采用递归和迭代两种思路解题。递归比较简单。int TreeDepth(TreeNode*pRoot){ if(!pRoot) return 0; int left=TreeDepth(pRoot->left...原创 2019-03-22 15:36:08 · 115 阅读 · 0 评论 -
【剑指offer刷题】--连续子数组的最大和
{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)本题可用动态规划来解,可以说是经典的动态规划题目。主要找到动态规划方程。F(i)表示连续子数组的和,则F(i)=max( F(i-1)+array[i] , array[i] ),因为题意中的array[...原创 2019-03-13 20:51:08 · 135 阅读 · 0 评论 -
【剑指offer刷题】--最小的k个数
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。看到本题后觉得有些简单,在三七互娱的笔试题中做过,可以先用快排,然后取前面的k个数即可,时间复杂度是O(NlogN),见方法一。但又一想,有没有其他的方法,想起来了堆这个结构,可用基于大根堆原理的priority_queue<>优先队列来解决这个问题。先...原创 2019-03-13 19:57:28 · 128 阅读 · 0 评论 -
【剑指offer刷题】19--顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.解:本题重点在与把握在打印矩阵的过程中有四个顺序,分别是从左到右 ,从上到下,从右到左,从下到上。根据这四个顺...原创 2019-03-25 17:13:09 · 164 阅读 · 0 评论 -
【剑指offer刷题】05--用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。入队:将元素进栈A出队:判断栈B是否为空,如果为空,则将栈A中所有元素pop,并push进栈B,栈B出栈;如果不为空,栈B直接出栈。用两个队列实现一个栈的功能?要求给出算法和思路!<分析>:入栈:将元素进队列A出栈:判断队列A中元素的个数是否为1,如果等于1...原创 2019-03-25 16:03:56 · 124 阅读 · 0 评论 -
【剑指offer刷题】--平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。解:/判断一颗二叉树是否为平衡二叉树平衡二叉树的特点:(1)左小右大(2)左右子树的高度差不大于1解法一:多次遍历节点求左右子树的高度。缺点在于重复遍历,例如首先遍历根结点1,那么根结点的的左子树2,,4,5,7遍历一遍;遍历左根结点2,那么4,5,7又会被遍历一遍。int getDepth(TreeNode* pR...原创 2019-03-20 19:45:38 · 742 阅读 · 1 评论 -
【剑指offer刷题】--数组中只出现的一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。解:本题的思路是采用哈希思想,时间复杂度O(n),空间复杂度O(N)void FindNums(vector<int> data,int *num1,int * num2){ if(data.size()<2) return ; unordered_m...原创 2019-03-20 17:23:23 · 164 阅读 · 0 评论 -
【剑指offer刷题】--数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007归并排序的改进,把数据分成前后两个数组(递归分到每个数组仅有一个数据项),合并数组,合并时,出现前面的数组值array[i]大于后面数组值array[j]时;则前面数组a...原创 2019-03-15 20:24:58 · 205 阅读 · 0 评论 -
【剑指offer刷题】--丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。首先从丑数的定义我们知道,一个丑数的因子只有2,3,5,那么丑数p = 2 ^ x * 3 ^ y * 5 ^ z,换句话说一个丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到,那么我们从1开始乘...原创 2019-03-15 15:47:43 · 102 阅读 · 0 评论 -
【剑指offer刷题】--把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解:本题关键在于将数字转为字符串并组合排序。对vector容器内的数据进行排序,按照 将a和b转为string后 若 a+b<b+a a排在在前 的规则排序, 如 2 21 因为 21...原创 2019-03-14 17:28:13 · 140 阅读 · 0 评论 -
【剑指offer刷题】--两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。解:思路一:栈如果存在共同节点的话,那么从该节点,两个链表之后的元素都是相同的。也就是说两个链表从尾部往前到某个点,节点都是一样的。我们可以用两个栈分别来装这两条链表。一个一个比较出来的值。找到第一个相同的节点。ListNode* FindFirstCommonNode(ListNode* pHead1,ListNode* pH...原创 2019-03-18 22:18:11 · 229 阅读 · 0 评论 -
【剑指offer刷题】--第一次只出现一次的字符--哈希表
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).解:看到题目中出现“找到第几次出现的次数”应该想到使用哈希表来解决。 int FirstNotRepeatingChar(string str) {//边界判断 if(str.empty(...原创 2019-03-22 15:03:57 · 193 阅读 · 0 评论 -
【剑指offer刷题】--滑动窗口的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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,...原创 2019-09-19 23:09:05 · 158 阅读 · 0 评论 -
【剑指offer刷题】--矩阵中的路径
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如在下面的3x4的矩阵中包含一条字符串"bcced"的路径(路径中的字母用斜体表示)。但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第...原创 2019-09-05 23:22:02 · 161 阅读 · 0 评论 -
【剑指offer刷题】--机器人的运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?解题思路: 回溯法,还可以解海岛...原创 2019-09-05 20:06:22 · 146 阅读 · 0 评论 -
【剑指offer刷题】20--栈--包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。对于栈和队列的问题,一般可以考虑使用两个栈和队列来解决问题,一个用来辅助解决问题。在本题中,使用两个栈s1和s2,s2作为辅助栈,压栈时进行比较,如果A栈的压入比B栈的大,则B不压入;如果小于等于,则AB同时入栈;出栈时,如果AB栈顶元素相同,则B出栈;不相同的话,A出...原创 2019-07-03 21:56:24 · 104 阅读 · 0 评论 -
【剑指offer刷题】--二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。采用分治法的思想,找到根结点、左子树的序列、右子树的序列,分别判断左右子序列是否为二叉树的后序序列。由题意可得:1. 后序遍历序列的最后一个元素为二叉树的根节点;2. 二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大...原创 2019-04-02 15:58:58 · 195 阅读 · 0 评论 -
【剑指offer刷题】21--栈--栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解:该题是模拟堆栈的操作,将原数(第一个序列)依次压栈,栈顶元素与所给出栈队列...原创 2019-03-30 15:06:44 · 152 阅读 · 0 评论 -
【剑指offer刷题】22--从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。解:该题是二叉树的层次遍历,借助队列queue来实现。// 二叉树的层次遍历,借助于队列queue实现vector<int> PrintFromTopToBottom(TreeNode*root){ vector<int> res; if(!root) return res; qu...原创 2019-03-30 14:59:18 · 114 阅读 · 0 评论 -
【剑指offer刷题】--扑克牌顺子
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,...原创 2019-04-03 21:37:08 · 178 阅读 · 0 评论 -
【剑指offer刷题】--一个数字在排序数组中出现的次数
题目描述统计一个数字在排序数组中出现的次数。解:看到排序数组,考虑到的是二分查找。这道题其实想考的是二分查找数字k,当然也可以用暴力搜索。解法一:使用C++中STL的lower_bound()和upper_bound()函数,找到待查找数组K的位置。实际运用中必须用返回值减去集合首地址才能正常的获取我们习惯的数组下标。#include<algorithm>bi...原创 2019-03-19 10:59:08 · 260 阅读 · 0 评论 -
【剑指offer刷题】--字符串的全排列
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。解:对122,第一个数1与第二个数2交换得到212,然后考虑第一个数1与第三个数2交换,此时由于第三个数等于第二个数,所以第一个数不再与第三个数交换。再考虑212,它的第二个数与第三个数交换可以得到解决221。此时全排...原创 2019-03-06 22:14:32 · 177 阅读 · 0 评论 -
【剑指offer刷题】--数组--数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解:本题可根据数组的特点和哈希表这两种解法。第一种:如果一个数出现的次数超过数组一半的长度,那么就是说出现的次数比其他所有数字出现的次数还要多。因此我们可以考虑保存2...原创 2019-03-06 15:47:58 · 171 阅读 · 0 评论 -
【剑指offer刷题】09--递归与循环--变态跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级,。。。,它也可以跳上n级,求该青蛙跳上一个n级的台阶总共有多少种方法?解答:用逆推的思路去想,跳n级台阶,可以从n-1级跳上来,也可以从n-2级跳上来,从n-3级跳上来,依次下去,从第1级跳上去,或直接跳上去,所以,跳n级台阶的方法数相当于其它所有台阶数的方法的总和再加上从0级跳上去,表达式为 f(n) = f(n-1) + f(n-...原创 2019-02-12 10:44:10 · 189 阅读 · 0 评论 -
【剑指offer刷题】10--递归与循环--矩阵覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?这道铺地砖题与菲波那切数列题和青蛙跳台阶题是一个题,都可以用递推思想和动态规划思想解决。if target<1, return 0; if target =1,return 1; 只有一种竖直摆放方法。 if target =2, r...原创 2019-02-12 11:14:33 · 183 阅读 · 0 评论 -
【剑指offer刷题】12--数值的整数次方--快速幂
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。使用快速幂原理,考虑base和exponent等于0和正负时的情况。(1)如果将a自乘一次,就会变成a^2。再把a^2自乘一次就会变成a^4。然后是a^8…… 自乘n次的结果是a^{2^{n}}。对吧……(2)a^xa^y = a^{x+y}...原创 2019-02-12 21:49:18 · 110 阅读 · 0 评论 -
【剑指offer】04--树--重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。/** * Definition for binary tree * struct TreeNode { * int val; *...原创 2019-02-27 22:50:34 · 113 阅读 · 0 评论 -
【剑指offer刷题】--字符串--字符流中第一个不重复的字符
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。如果当前字符流没有存在出现一次的字符,返回#字符。解:出现的字符 和 它的出现的次数 是一种对应关系,自然联想到 哈希表的 key-value 这种对应,使用unordere...原创 2019-02-22 20:45:25 · 130 阅读 · 0 评论 -
【剑指offer刷题】--字符串--把字符串转换成整数
将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。解:本题主要考虑多个边界因素和判断条件。当字符串为空时,返回0;当字符串中出现字母时,返回0;当字符串的第一个字符为+-正负号时,进行判断。int StrToIn...原创 2019-02-22 20:06:24 · 218 阅读 · 0 评论 -
【剑指offer刷题】--链表--删除链表中的重复节点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5解:该链表中的头结点可能与后面的结点重复,也就是说头结点也可能被删除,所以在链表头添加一个结点。我们从头遍历整个链表。如果当前结点的值与下一个结点的值相同,那么它们就是...原创 2019-02-17 18:19:55 · 221 阅读 · 0 评论 -
【剑指offer刷题】--字符串--表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。解:本题是分为多种情况讨论,分为正负号,有无e,有无点.原创 2019-02-21 22:45:55 · 127 阅读 · 0 评论 -
【剑指offer刷题】--字符串--正则表达式匹配
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配解:先搞清楚题意,明白str和pattern表示的两种模式,本题分为多种情况:首先,考虑特殊...原创 2019-02-21 21:48:37 · 200 阅读 · 0 评论 -
【剑指offer刷题】07--递归与动态规划--斐波那切数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字来说,就是斐波那契数列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。解法1:递推法:int Fibon...原创 2019-02-11 22:08:32 · 328 阅读 · 0 评论 -
【剑指offer刷题】02--字符串--替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解:根据代码提示,传入类中的参数: 字符串地址str 和 字符串长度length,length没有什么用,通过对字符串的结束标志:\0 判断是否结束判断字符串长度!思路:从前往后记录空格数量,从后往前替换空格。引入两...原创 2019-02-10 16:22:23 · 198 阅读 · 0 评论 -
【剑指offer刷题】01--数组--二维数组中的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。输入 :array: 待查找的二维数组 target:查找的数字解:第一种方法:利用二维数组由上到下,由左到右递增的规律,那么选取右上角或者左下角的元素a[row][col]与target进行比较,以选取左下...原创 2019-02-10 12:35:01 · 156 阅读 · 0 评论 -
【两周编程学习】--栈与队列
一、栈的学习先看一下栈的存储结构:栈是先进后出的存储结构在递归过程中用到了栈,递归定义必须至少有一个条件, 满足时递归不再进行, 即不再引用自身而是返回值退出。#include<stack>stack<int> s;栈的基本用法有:push():向栈内压入一个元素;pop():从栈顶弹出一个元素;empty():如果栈为空,...原创 2019-03-02 17:38:59 · 188 阅读 · 0 评论 -
【剑指offer刷题】18--树--二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5...原创 2019-03-02 14:26:27 · 133 阅读 · 0 评论 -
【剑指offer刷题】17--树结构--树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)对于两棵二叉树来说,要判断B是不是A的子结构,首先第一步在树A中查找与B根节点的值一样的节点。 通常对于查找树中某一个节点,我们都是采用递归的方法来遍历整棵树。 第二步就是判断树A中以R为根节点的子树是不是和树B具有相同的结构。这里同样利用到了递归的方法,如果节点R的值和树的根节点不相同,则...原创 2019-03-02 11:51:51 · 100 阅读 · 0 评论 -
【剑指offer刷题】11--按位与--二进制中1的个数
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。简单说明知识点:1.原码、反码、补码数字在计算机中是以特定的编码方式存储的,在这里以正数 +1 和负数 -1为例,以8位二进制存储。原码:+1:0000 0001 -1:1000 0001 符号位加上真值的绝对值,第一位是符号位,0表示正数,1表示负数反码:+1: 0000 0001 ...原创 2019-02-14 11:28:18 · 263 阅读 · 0 评论