![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer刷题
Strivee_
厚积薄发,天助自助者也!
Stay hungry,stay young!
展开
-
剑指offer40:最小的k个数
(一)题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。(二)思路分析(三)代码实现//使用c++标准模板库进行实现class Solution {public: vector<int> GetLeastNumbers_Solution (v...原创 2019-10-13 13:13:56 · 243 阅读 · 0 评论 -
剑指offer65:不用加减乘除做加法
(一)题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。(二)思路分析 首先分析十进制的5+17=22这个结果的。实际上我们可以分成三部执行:第一步只做各位相加不进位,得到12;第二步做进位,得到10;第三步将前面两个结果加起来,得到22. 二进制与十进制的思路相同。5的二进制是00101,17的二进制是1000...原创 2019-08-13 16:32:12 · 162 阅读 · 0 评论 -
剑指offer30:包含min函数的栈
(一)题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。(二)思路分析 当最小元素被弹出栈的时候,为了得到下一个最小的元素,所以应该保留次小元素。 即定义两个栈,一个数据栈,一个辅助栈。 数据栈存放每次添加的数值;辅助栈存放之前的最小元素与新压入栈元素两者的较小值(三)...原创 2019-07-31 17:58:09 · 188 阅读 · 0 评论 -
剑指offer33:二叉搜索树的后序遍历序列
(一)题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。(二)思路分析 后序遍历左右根,左子树结点值都比根节点的值小,右子树的值都比根节点的值大,根据递归算法(三)代码实现class Solution {public: bool VerifySq...原创 2019-07-31 17:54:17 · 149 阅读 · 0 评论 -
剑指offer35:复杂链表的复制
(一)题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)(二)思路分析 把N’复制到N的后面,再把新旧链表分开 第一步:先复制原链表上的每个节点,并用next连接起来 ...原创 2019-07-31 17:50:28 · 113 阅读 · 0 评论 -
剑指offer38:字符串的排列
(一)题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。(二)思路分析 a.求所有可能出现在第一个位置的字符,第二步是固定第一个字符,求后面所有字符的排列 b.拿第一个字符与它之后的字符逐个交换,典型的递归思路(...原创 2019-07-31 17:44:58 · 199 阅读 · 0 评论 -
剑指offer39:数组中出现次数超过一半的数字
(一)题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。(二)思路分析 假设在数组中出现的次数超过数组长度一半的数字为a,a出现的次数比其他所有数字出现的次数的和都要多。设用于存储a的整形变量r...原创 2019-07-31 17:41:50 · 111 阅读 · 0 评论 -
剑指offer50:第一个只出现一次的字符
(一)问题描述 在字符串中找到第一个只出现一次的字符。如“google”中第一个只出现一次的字符是“l”.(二)思路分析 使用哈希表来记录每个字符出现的次数,因为字符char为8位,总共有256个值,所有哈希表有256个元素,其中把字符的ASCII码作为哈希表的键值,而对应键值储存的是该字符出现的次数。那么对给定的字符串进行两次遍历,第一遍收集信息,即统计每个字...原创 2019-07-31 17:32:44 · 137 阅读 · 0 评论 -
剑指offer17:打印从1到最大的n位数(常规方法,递归方法)
(一)题目描述 输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3,一直到最大的三位数即999.(二)算法分析与代码实现 常规方法:用字符串或数组存储大数,因为数字最大是n位的,所以定义字符串长度为n+1(字符串最后一位是‘\0’),字符串中的每个字符都是‘0’到‘9’之间的某个数字。当实际数字不够n位时,在字符串的前半部分补0。假设...原创 2019-07-30 20:32:15 · 314 阅读 · 0 评论 -
剑指offer18:删除链表的节点(删除指定节点,删除重复节点)
题目一在O(1)时间内删除链表的节点。给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。解决思想法一(不采用):从链表的头结点开始,顺序遍历查找要删除的结点,并在链表中删除该结点,时间复杂度O(n)法二:(1)把待删结点的下一个结点的内容复制到待删结点上,覆盖原有的内容,然后把下一个结点删除,这就相当于把当前需要删除的结点删除了。(2)若删尾结点,由于...原创 2019-07-31 16:48:05 · 286 阅读 · 0 评论 -
剑指offer9:用两个栈实现队列
(一)问题描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。(二)思路分析 入队时直接入到栈1,出队时分两种情况:若栈2没有数据则从栈1将数据入到栈2,从栈2出;若栈2有数据则直接从栈2出。(三)代码实现class Solution{public: void push(int node) { ...原创 2019-07-21 20:54:50 · 122 阅读 · 0 评论 -
剑指offer7:重建二叉树
(一)问题描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的头节点。(二)思路分析 根据先序序列第一个数确定树的根节点,在中序序列中找到这个数所在的位置,此处左边为左子树...原创 2019-07-21 20:48:26 · 94 阅读 · 0 评论 -
剑指offer6:从尾到头打印单链表
(一)问题描述 输入一个链表的头节点,从尾到头反过来打印出每个节点的值。(二)思路分析 通常打印是一个只读操作,所以不能改变原链表的结构。遍历的顺序是从头到尾,输出的顺序是从尾到头,这是栈“后进先出”的思想。所以我们可以用栈实现。每经过一个节点的时候,把该节点放到一个栈中,当遍历完整个链表后,再从栈顶开始逐个输出节点的值。(三)代码实现#include...原创 2019-07-21 20:34:35 · 188 阅读 · 0 评论 -
剑指offer5:替换空格
(一)问题描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。(二)解决思路 原来一个空格字符被'%', '2', '0'三个字符替换后,字符串会变长。这可分为两种情况: 情况一:如果是在原来的字符串进行替换,有可能覆盖原字符串后面的字...原创 2019-07-21 17:20:01 · 185 阅读 · 0 评论 -
剑指offer4:二维数组中的查找
(一)问题描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数组7,则返回true;如果查找数字5,则返回false。 ...原创 2019-07-21 15:30:51 · 144 阅读 · 0 评论 -
剑指offer11:旋转数组的最小数字
(一)题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。(二)思路分析 直观的解法:是从头到尾遍历一次数组,找到最小数字,时间复...原创 2019-07-30 14:09:29 · 175 阅读 · 0 评论 -
剑指offer10:斐波那契数列(递归/非递归)
(一)题目描述题目一:求斐波那契数列的第n项。(二)思路分析求解斐波那契数列有两种常用的算法:递归算法和非递归算法。算法一:递归解法。我们以求解F(10)为例来分析递归的求解过程。想求得F(10),需要先求的F(9)和F(8)。同样,想求得F(9),需要先求得F(8)和F(7)......依次类推,直至必须先计算F(1)和F(0),然后逆推得到F(n-1)和F(n-2)的结果,...原创 2019-07-30 12:15:37 · 443 阅读 · 0 评论 -
剑指offer16:数值的整数次方
(一)题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。不得使用库函数,同时不需要考虑大数的问题。(二)思路分析 算法的时间复杂度为O(logn)。通过递归实现,有一个公式:y为偶数时:x^y=x^(2/y) * x^(2/y)... 如:3^32 = (3^16) *(3^16...原创 2019-07-24 21:32:05 · 186 阅读 · 0 评论 -
剑指offer15:求二进制中1或0的个数
(一)题目描述 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数。例如,把9表示成二进制是1001,有2位是1.因此,如果输入9,则该函数输出2.(二)思路分析 把一个整数减去1,再和原整数做与&运算,会把该整数最右边的1变为0.那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。(三)代码实现//32位的平台#in...原创 2019-07-24 21:27:27 · 249 阅读 · 0 评论