剑指offer
文章平均质量分 56
哈哈大师2017
笨鸟先飞
展开
-
循转数组找最小值C++
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。之前是做过类似题的,不过之前做的时候没有坑,当时给的数组要求是递增的,直接二分查找很简单的就搞定了,剑指offer这道题给...原创 2018-03-17 23:41:21 · 327 阅读 · 0 评论 -
数组中重复的数字(剑指offer)
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。利用哈希表数组进行映射,如申请一个数组a[],a[0] = 1,a[1]=1,a[2]=2,a[3]=2,a[5]=1;细节见...原创 2018-03-26 16:06:49 · 112 阅读 · 0 评论 -
(剑指offer)字符流第一个不重复的字符C++
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。在数组、字符串中,与元素是否重复相关的问题,应该要首先想想能不能用哈希表来解决,利用映射关系可以记录不同元素的累加值;这道题就直接用一个哈希数组记录不同字符的数目,然后再遍历整个字...原创 2018-03-26 16:37:19 · 303 阅读 · 0 评论 -
(剑指offer)二叉树的深度(递归与非递归版本)
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。一、递归版本;若存在左子树,则将左子树深度加1;若存在右子树,则将右子树深度加1;若左右子树均存在,则将左、右子树深度均加1取最大值;细节见代码:int TreeDepth(TreeNode* pRoot) { if (pRoot == NULL)...原创 2018-03-26 17:24:40 · 399 阅读 · 0 评论 -
(剑指offer)把二叉树打印成多行
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。这道题与之前做的几道题的方法一致,借助队列数据结构,采用广度优先遍历的方法,将每一层的兄弟结点依次入队,再依次出出队列,这里需要一个标记记录每一层结点的数目,根据标记的值可以知道一层结点是否打印完毕;细节见代码:/*struct TreeNode { int val; struct TreeNode *lef...原创 2018-03-26 17:39:53 · 145 阅读 · 0 评论 -
二叉搜索树的第k大结点
题目描述给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。设计到二叉搜索树,就应当知道一个二叉搜索树的重要知识,那就是其中序遍历是递增序列。在得到一个递增序列之后就很容易获得第k大的值;这里我用非递归的方法对二叉树进行序列化,用到栈对结点进行缓存。细节见代码:/*struct TreeNode { ...原创 2018-03-26 20:15:29 · 185 阅读 · 0 评论 -
(剑指offer)和为S的两个数
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。这道题其实就是经典的2-SUM问题变型题,可以使用的双指针遍历整个数组,找出符合题目要求的两个数。细节见代码:class Solution {public: vector<int> FindNumbersWithSum(vector<i...原创 2018-03-26 21:22:55 · 170 阅读 · 0 评论 -
(剑指offer)左旋转字符串C++
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!这道题的思路可以借鉴矩阵论中的转秩思想,将字符转分为两部分,每个部分分别进行反转,然后再对整体进行一次...原创 2018-03-26 21:45:02 · 407 阅读 · 0 评论 -
(剑指offer)反转单词顺序列C++
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?这道题其实是字符串向左循环左...原创 2018-03-28 23:19:28 · 1016 阅读 · 0 评论 -
字符串转整型数(剑指offer/leetcode)
实现 atoi,将字符串转为整数。提示:仔细考虑所有输入情况。如果你想挑战自己,请不要看下面并自己考虑所有可能的输入情况。说明:这题解释的比较模糊(即没有指定输入格式)。你得事先汇集所有的输入情况。字符串转整型数是典型的字符串处理, 对于这道题没有什么技巧,就是一个字符一个字符进行处理,同时需要对边界条件进行有效的控制1、循环遍历跳过数字前的空格;2、记录第一个正负符号;3、正负号后开始对字符串进...原创 2018-03-29 12:44:03 · 246 阅读 · 0 评论 -
变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。非递归:class Solution {public: int jumpFloorII(int number) { if (number == 0) { return 0; } ...原创 2018-07-09 22:55:20 · 163 阅读 · 0 评论 -
二维数组查找(剑指offer/C++)
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。很久以前就做过这道题,那会儿刚刷题也没想怎么优化,前几天室友面试的回来分享了这道面试题,又来看看,又一次证明自己太懒了,N^2的复杂度以前也能接收。这里又重新做了一遍,见代码:class Solut...原创 2018-08-01 22:11:25 · 318 阅读 · 0 评论 -
C++ 前序遍历和中序遍历重构二叉树(剑指offer)
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。这道题之前做过几次,以前的做法比较粗暴,每次都会申请新的空间存储前序遍历和中序遍历进行递归,这次做了一些改进,用两个指针记录新的中序遍历前后端进行递...原创 2018-09-11 10:15:02 · 1211 阅读 · 0 评论 -
从上往下打印二叉树C++
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。打印二叉树的有两种方式:深度优先遍历或者广度优先,这道题要求同层结点从左至右打印, 说明需要进行广度优先遍历,为了达到这个目的,我们需要借助数据结构:队列,不断将根结点、左孩子结点、友孩子结点push进入队列中,同时进行打印操作;具体细节见代码:/*struct TreeNode { int val; struct TreeNod...原创 2018-03-22 12:35:58 · 3400 阅读 · 2 评论 -
数组中的逆叙述对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007刚开始我是采用暴力枚举的方式求解,但是由于复杂度太高不能通过;于是尝试的其他人提到归并排序的方法,凑巧的刚刚写了归并排序的算法,就拿来检验一下,果然顺利通过;过程中有一个坑大家需要注意的是,...原创 2018-03-26 13:40:17 · 217 阅读 · 0 评论 -
连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至...原创 2018-03-20 15:12:36 · 93 阅读 · 0 评论 -
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?如果你能看出其中规律就知道这是一道佩波那契数列的变化,或者直接用动态规划的思路来解题,多刷题自然会找到动归的响应套路,这里我们需要讨论两种情况,最后一块砖是竖着放还是横着放;用dp数组记录不同的状态1、若最后一块砖竖着放,那么上一块儿砖则也应当是并列竖着放,否则不...原创 2018-03-18 10:17:16 · 486 阅读 · 0 评论 -
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。这道题主要考察大家对一个数在计算机中的二进制表示形式的理解,比较基础,但是也是大家比较容易忽视的地方;因此,需要再巩固一下细节。一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1原码:原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位...原创 2018-03-18 11:04:58 · 442 阅读 · 0 评论 -
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。乍一看这道题,以为这题应该不会就是求个幂次方这么简单,怎么可能这么简单呢,事实证明,这道题就是不用多想,用个循环把值求出来就行,唯一需要注意的地方就是记得处理幂次的正负两种情况,细节请看代码把。class Solution {public: double Power(do...原创 2018-03-18 11:22:26 · 693 阅读 · 0 评论 -
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。1、看到这道题的时候,最懒的思路就是用两个队列分别缓存奇数和偶数,等扫描完毕之后再循环赋值回去,可惜的是这样做需要的空间受到限制;2、出题者原意肯定是希望解题者在原数组上进行操作,而不借助额外的数据结构。3、我的解题思路...原创 2018-03-18 14:21:17 · 299 阅读 · 0 评论 -
给定一个向量/数组,判定该向量/数组是否为一个二叉搜索数的后续遍历C++
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。做这道题之前,我们至少要对二叉搜索树的性质有一定的了解,其中与本题关系最为紧密的一条性质就是二叉搜索树中根结点的左子树的元素值均要小于根结点的值,根结点的左子树的值均要大于根结点上的值;因此,我们利用上述性质可以递归遍历整个向量中的元素判定该数组是不是某...原创 2018-03-22 13:57:59 · 247 阅读 · 0 评论 -
输入一个链表,输出该链表中倒数第k个结点。
题目描述输入一个链表,输出该链表中倒数第k个结点。 链表的题都不是很难,基本上就是考察编程的基本功,熟悉指针的指向;这道题是打印倒数k个结点,那么就可以利用的个指针i、j,一个先走k-1步,另一个再同步走,当前者指向链表的尾指针时,那么后者指向的结点就为所求;最应该注意的是边界条件的判定,这是很多时候代码不能通过的重要因素。细节就看代码吧。/*struct ListNode { int val...原创 2018-03-18 22:28:21 · 251 阅读 · 0 评论 -
输入一个链表,反转链表后,输出链表的所有元素。
题目描述输入一个链表,反转链表后,输出链表的所有元素。实现链表反转的方法不止一种,我采用的方法算是头插之类的方法吧;1、定义两个结点,pre、cur;2、pre指向链表头的结点,cur指向头结点的下一个结点;3、由cur遍历整个链表,并不断将结点插入pre与phead之间,这样就实现来反转;为了保证算法的bugfree,记得考虑边界条件;具体实现看代码:/*struct ListNode { in...原创 2018-03-19 13:06:38 · 745 阅读 · 0 评论 -
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。C++
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。有序合并两个链表主要注意三点:1、同步遍历;2、结点值大小判断;3、同步遍历结束之后,还要记住判断是否还存在某个链表没有遍历完全;细节见代码:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x),...原创 2018-03-19 13:20:13 · 951 阅读 · 0 评论 -
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。C++
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。求字符串全排列可以利用递归(深度优先搜索)、非递归两种;采用递归求解全排列需要注意的一点是需处理字符串中重复元素出现的情况;我这里采用非递归的方式,这样可以很好的处理重复元素的问题。思路分为三个步骤:1、从后往前查找第...原创 2018-03-19 14:22:39 · 3232 阅读 · 2 评论 -
求数组中的绝对众数
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。求解绝对众数之前,我们可以先了解下众数及绝对众数的含义;众数:给定N个数,称出现次数最多的数称为众数;绝对众数:若某个众数出现的次数大于N/2,称该数为绝对众数;了解绝对众数的含义之...原创 2018-03-19 16:29:58 · 832 阅读 · 0 评论 -
判断栈的压入顺序与弹出顺序是否正确C++
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)这道题既然有关栈的压入与弹出操作,那么就可以直接借助数据结构栈,本题比较简单,细节见代码:cl...原创 2018-03-20 14:12:05 · 463 阅读 · 0 评论 -
最小的k个数(C++)
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。求最小k个数,或者求第k大的数,或者求第k小的数;像这类题型的解题思路就是先进行排序,再按找题意找出相应的值。对于排序的话,我一般会采用快速排序法;这道题大家需要处理的边界是k大于输入vector的长度时的情况,此时应当返回空vector;另外一个需要注意的是,在将ve...原创 2018-03-20 14:50:29 · 2667 阅读 · 0 评论 -
数据流中的中位数(剑指offer/C++)
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。室友大晚上回来和我分享这道题解题思路,他给出的方案是借助最大堆和最小堆数据结构解题,这一块我应用不是很...原创 2018-10-04 15:25:19 · 670 阅读 · 0 评论