剑指offer
文章平均质量分 53
qiki_tang
不积硅步无以至千里,突破自己,糖没味儿加油!
展开
-
数字转换成excel字母
数字转换成excel字母给定正整数,返回Excel工作表中显示的相应的列。【例如】 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> AB ...解题算法 -- accept对n进行n%26去余再n/26,得0-25个数,即A-Z...原创 2019-04-16 14:46:31 · 936 阅读 · 0 评论 -
字典序的应用
一、题目描述输入n,m,k,表示n个“a”字符,m个“z”字符组成一个字符串,要求出字典序从低到高组成的第k个字符串是什么?【举例】n = 2,m = 2,k = 6则该字符串构成的字典序排列为:aazz azaz azza zaaz zaza zzaa第6个字符串为:zzaa二、题目分析1)C语言自己写全排列程序2)使用C++库里的next_permutati...原创 2018-08-11 17:55:36 · 456 阅读 · 0 评论 -
39-求二叉树的最小深度和最大深度
问题描述给定一个二叉树,找出其最小深度和最大深度。二叉树的最小深度为根节点到最近叶子节点的距离。二叉树的最大深度为根节点到最远叶子结点的距离 给出一棵如下的二叉树: 1 / \ 2 3 / \ 4 5 这个二叉树的最小深度为 2,最大深度为3解题思路一定要注意定义,比如下面这棵树的最小深度...原创 2018-02-14 21:10:05 · 982 阅读 · 0 评论 -
37-判断链表是否相交【找出第一个公共结点】
一、问题描述编写一个程序来查找两个单独链接列表的交集开始的节点。例如,以下两个链表:A: a1 → a2 ↘ c1 → c2 → c3 ↗B: b1 → b2 → b3开始在节点c1相交。【提示】如果两个链表完全没有交集,则返回null。...原创 2018-07-06 09:18:16 · 390 阅读 · 0 评论 -
39-判断二叉树是否为平衡二叉树【树的深度&后序遍历】
一、问题描述输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。二、解题思路思路一:先递归求各结点的深度,根据深度做差值,根据差值判断是否为平衡二叉树思路二:后序遍历二叉树,在遍历的同时记录深度---避免思路一的重复计算三、解题算法1、思路1:根据深度求差值/******************...原创 2018-08-09 09:16:28 · 864 阅读 · 0 评论 -
36-归并排序找逆序对
一、问题描述在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数二、解题思路使用归并排序实现逆序对的求解三、解题算法/************************************************author:tmwdate:2018-8-4**********************...原创 2018-08-04 18:45:51 · 244 阅读 · 0 评论 -
35-求字符串中第一个只出现一次的字符
一、问题描述在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出'b'二、解题思路构建一个哈希表,其中键用来存这个字符信息,值用来记录该值出现的次数需要遍历两次这个字符串第一次遍历:构建哈希表 ---O(n)时间复杂度第二次遍历:哈希表的查找---O(1)时间复杂度三、解题算法/**********************************...原创 2018-08-04 17:37:37 · 185 阅读 · 0 评论 -
34-丑数
一、问题描述我们把只包含因子2、3和5的数称作丑数,求按从小到大的顺序的第1500个丑数。例如6、8是丑数,但是14不是,因为它包含因子7.习惯上我们把1当做第一个丑数二、解题思路解法一:逐个判断数字是否为丑数解法二:构建一个丑数数组,返回第1499位置上的元素三、解题算法解法一:逐个判断数字是否为丑数/*********************************...原创 2018-08-04 16:39:17 · 143 阅读 · 0 评论 -
16-2 单链表从位置n到位置m的翻转
一、问题描述反转从位置m到n的链接列表。 在原地进行并一次完成。例如:给定1-> 2-> 3-> 4-> 5> nullptr,m = 2和n = 4,返回1-> 4-> 3-> 2-> 5> nullptr。注意:给定m,n满足以下条件:1 <= m <= n <=列表长度二、解题思路 1)找到待翻转的m...原创 2018-07-06 09:13:45 · 1167 阅读 · 0 评论 -
16-1 单链表的简单翻转
一、题目描述对链表整体做翻转二、解题思路定义三个指针*pre 、*cur 、*next三、解题算法/*****************************************************Author:tmwDate:2018-4-13*****************************************************/#include <st...原创 2018-07-06 09:11:27 · 176 阅读 · 0 评论 -
40-找数组中只出现奇数次的n个数字(n=1,2)
一、题目描述题目一:一个整型数组里除了1个数字之外,其他的数字都出现了偶数次,找出这个数字,要求时间复杂度O(n),空间复杂度O(1)题目二:一个整型数组里除了2个数字之外,其他的数字都出现了偶数次,找出这两个数字,要求时间复杂度O(n),空间复杂度O(1)二、解题思路题目一:异或运算,偶数个一样的数异或为0,异或符合交换律,所以只需要把所有数组中所有数字异或一次就可以了题目二:整...原创 2018-08-07 21:24:04 · 608 阅读 · 0 评论 -
41-找和为sum的连续正数序列
一、题目描述输入一个正数sum,打印出所有和为sum的连续正数序列(至少含有两个数),例如输入15,由于1+2+3+4+5=4+5+6=7+8,所以结果打印出三个连续序列1~5、4~6和7~8二、解题思路该题的特殊点在于,找的是一个递增的连续序列,基本思路如下:1)设定两个参数small和big用于分别表示最小值和最大值,根据题目的特点,将small初始化为1,big初始化为22)...原创 2018-08-07 22:35:43 · 290 阅读 · 0 评论 -
字符串A中删除字符串B中所有字符
一、问题描述输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入A串”They are students.”和B串”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”二、问题分析此题分为两个部分来解答 1)查找在A串中出现的B串字符 2)删除A串中的字符对于第1)个问题,能做到快速查找的方法是二分和哈希,这里明显用哈希更合适,...原创 2018-10-22 23:47:18 · 5447 阅读 · 0 评论 -
21-实现带有min函数的栈和队列
一、题目描述【带有min函数的栈】实现一个栈,带有入栈(Push),出栈(Pop),取最小元素(getMin)三个方法。要保证三个方法的时间复杂度都尽可能小【带有min函数的队列】实现一个队列,带有出队(deQueue),入队(enQueue),取最小元素(getMin)三个方法。要保证三个方法的时间复杂度都尽可能小二、解题思路【带有min函数的栈】思路思路一:额外申请...原创 2018-09-02 19:39:01 · 800 阅读 · 2 评论 -
65-滑动窗口
一、题目描述给定一个数组和滑动窗口大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小为3,那么一共存在6个滑动窗口,它们的最大值分别为{4,4,6,6,6,5}二、解题思路申请一个windowMax数组,用来存放每一个窗口下的最大值申请一个两端开口的队列,用来保存可能为滑动窗口中最大值的下标,这个队列的特点在于: 1)队...原创 2018-09-07 08:50:15 · 239 阅读 · 0 评论 -
【二分查找】原型和变种以及相关思考
一、写在前面的话笔者在面一家非常NB的互联网公司时,面到了二分查找的变种题,回来后对这个看似简单的二分查找做了深入的思考,可能也不算深入,但至少比之前是更加领教了它的厉害。每一次面试都会带来不一样的思维启迪,面完这家公司带给我最大的启迪就是学算法不止学它本身,应该看到它的边界和可扩展性,经常想想这些好的经典算法,让它融入到自己潜意识里,才算真正掌握。话不多说,开始上干货。二、二分查找原型...原创 2018-09-07 08:50:50 · 822 阅读 · 0 评论 -
50-求树中两个结点的最低公共祖先(多种解法扩展)
一、题目描述【题型一】输入一个树的两个结点,限定该树为二叉搜索树,求这两个结点的最低公共祖先(最低父亲结点)【题型二】输入一个树的两个结点,该树为普通树,求这两个结点的最低公共祖先(最低父亲结点),ps:树中每个节点有parent(三叉链)【题型三】输入一个树的两个结点,该树为普通树,求这两个结点的最低公共祖先(最低父亲结点)限定条件:该树不存在指向父结点的指针二、解题思路【题...原创 2018-08-21 21:04:18 · 308 阅读 · 0 评论 -
53-正则表达式匹配
一、题目描述实现正则表达式匹配,支持'.' 和'*';‘.’:匹配任何单个字符。 '*':匹配零个或多个前面的元素。匹配应覆盖整个输入字符串(不是部分)。函数原型应该是:bool isMatch(char* s, char* p) s可以是空的并且只包含小写字母a-z。 p可以是空的并且只包含小写字母a-z和字符.要么*。二、题意分析Input:s = "m...原创 2018-08-24 17:17:14 · 160 阅读 · 0 评论 -
64-字符串中有效数值的判定-含科学计数数
一、题目描述请实现一个函数用来判断是否表示数值(包括整数和小数)例如:字符串:“+100”、“5e2”、“-123”、“3.1416”、“-1E-16”都表示数值字符串:“12e”、“la3.14”、“1.2.3”、“+-5”、以及"12e+5.4"都不是二、解题思路不考虑字符串有多余空格的前提下,此题主要关注点如下:1)字符串开头可能会有“+”或者“-”号2)处理完1)之后...原创 2018-08-26 18:45:19 · 428 阅读 · 0 评论 -
11-数值的整数次方
一、题目描述实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题二、解题思路在不考虑大数问题下,此题还需要考虑的点包括:1)底数为0 并且 指数为负数 -- 分母不能为0 --> 需要有错误标识2)指数为负数时,结果需要取倒为了提高运算效率,在求次方运算时,不使用f...原创 2018-08-26 12:01:59 · 148 阅读 · 0 评论 -
51-【巧解】统计无序数组各元素出现的次数--时间复杂度O(n),空间复杂度O(1)
一、问题描述【题型一】一个长度大小为n的数组,数组中的每个元素的取值范围在[1,n],且为正整数。问:如何在时间复杂度为O(n),空间复杂度为O(1)的条件下,统计数组中不同元素出现的次数。【题型二】在一个长度为n的数组里的所有数字都在0-n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。【例如】如果...原创 2018-04-27 16:38:30 · 3179 阅读 · 0 评论 -
31-最大连续子数组和
问题描述 给定一个整数数组,数组里可能有正数、负数和0。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。方法1–暴力搜索从数组位置0出发,依次顺序递加后,和值的最大值` 从数组位置1出发,依次顺序递加后,和值在前两轮最大值(因为满足最大条件后,最大值才更新;……直到遍历到数组最后一个位置numSize-1 ,和值在前num...原创 2017-11-21 15:57:51 · 798 阅读 · 0 评论 -
4-替换空格
一、题目描述请实现一个函数,把字符串里的每个空格替换成"%20"。例如输入:“we are happy”输出:“we%20are%20happy”二、解题思路【提醒】此题给的需求不够明确,不清楚面试官是要求在原串中改动还是可以重新分配内存改动,当然如果是在原串改动的话需要预留足够多的空间存储,否则必然输出会不全。所以这里需要跟面试官再细化下需求【假设】这里假设面试官的需求是在一个内存预留足够多的原...原创 2018-06-29 10:29:52 · 169 阅读 · 0 评论 -
5-从尾到头打印链表
一、题目描述输入一个链表的头结点,从尾到头反过来打印出每个结点的值二、解题思路【思路一---从头到尾入栈输出】借助栈的数据结构【思路二---递归即栈,用递归】递归本质上是一个栈结构,所以可考虑递归三、解题算法方法1、借助栈/************************************************author:tmwdate:2018-6-27*************...原创 2018-06-29 10:26:32 · 95 阅读 · 0 评论 -
23-二叉树的建立及层序遍历的实现
笔者的话 二叉树的层序遍历与其它三种遍历方式实现方式有点不一样,它与图的BFS思想一样,需要用到FIFO队列这种数据结构,C语言代码实现起来略复杂,因此笔者将层序遍历单独拿出来,方便代码的阅读。程序思想:先将树的根节点入队, 如果队列不空,则进入循环 { 将队首元素出队,并输出它; 如果该队首元素有左孩子,则将其左孩子入队; 如果该队首元素有...原创 2018-02-14 16:10:07 · 932 阅读 · 0 评论 -
20-顺时针打印二维数组
一、题目描述输入一个矩阵,按照从外到里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16则依次打印数字:1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10二、解题思路结合画图说明本题有两点要考虑:1)顺时针旋转几次结束?2)如何实现顺时针打印?针对第1点:...原创 2018-06-30 23:11:16 · 1040 阅读 · 0 评论 -
19-二叉树的镜像
一、题目描述请完成一个函数,输入一个二叉树,该函数输出它的镜像例如: 8 --- 二叉树A / \ 6 10 / \ / \ 5 7 9 11--------------------------------- 8 --- 镜像二叉树 / \ 10 6 / \ / \ 11 9 7 5二、解题思路分析镜像二...原创 2018-06-30 23:09:12 · 152 阅读 · 0 评论 -
18-树的子结构
一、题目描述输入两棵二叉树A和B,判断B是不是A的子结构例如: 8 --- 二叉树A / \ 8 7 / \ 9 2 / \ 4 7--------------------------------- 8 --- 二叉树B / \ 9 2则二叉树B是A的子结构二、解题思路本题主要考察二叉树的遍历...原创 2018-06-30 23:06:14 · 218 阅读 · 0 评论 -
17-合并两个排序的链表
一、题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入下面的链表1和链表2,则合并之后的链表3如下所示链表1: 1->3->5->7链表2: 2->4->6->8合并链表3:1->2->3->4->5->6->7->8二、解题思路分析合并过程,链表1的头结点值小于链...原创 2018-06-30 23:03:48 · 173 阅读 · 0 评论 -
15-链表中倒数第k个结点
一、题目描述 插入一个链表,输出该链表中倒数第k个结点,为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个结点。【例如】一个链表有6个结点,从头到尾依次是1、2、3、4、5、6,这个链表的倒数第3个结点是值为4的结点二、解题思路一前一后两个指针设置prev指针,让它先走k-1步,当走到第k步时,back指针从1开始走。当prev指针走到表尾,则back指针指向的元素...原创 2018-06-30 23:01:12 · 157 阅读 · 0 评论 -
13-O(1)时间删除链表结点
一、题目描述给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。二、解题思路1)当删除结点不是尾结点也不是头结点时把该结点下一个结点的内容复制到这个结点,删除下一个结点 -- 实现O(1)2)当该链表只有一个结点时删除此结点,并把链表头结点置NULL -- O(1)3)当删除的结点是尾结点时(链表不止一个结点)从头到尾遍历,找到该结点的上一个结点,删除该节点 -- 复杂度O(...原创 2018-06-30 22:57:39 · 103 阅读 · 0 评论 -
12-打印1到最大的n位数
一、题目描述输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1、2、3、...、999,最大的3位数即999二、解题思路【题目陷阱】当输入的n很大的时候,求最大的n位数不论用int还是long long都会溢出,所以,在表示大数问题时,最容易想到的方法是用字符串或者数组来表达大数。此题用字符串来存1到n位十进制数的所有输出数代码编写时,要注意分清进位和溢出的处理三、解题算法/*...原创 2018-06-30 22:55:45 · 119 阅读 · 0 评论 -
10-二进制中1的个数
一、题目描述 请实现一个函数,输入一个整数,输出该二进制表示中1的个数。例如把9变成二进制是1001,有2位是1。因此如果输入9,该函数输出2二、解题思路 如果选择对输入的二进制数本身做右移,通过与1做与运算记录该二进制中1的个数,则当该二进制数为负数时(原正数取反加1),由于符号位为1,右移高位补1,会导致死循环所以不选择对原二进制数本身做移动,那么就有如下两种解题思...原创 2018-06-30 22:40:45 · 135 阅读 · 0 评论 -
21-包含min函数的栈
一、问题描述定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min、push及pop的时间复杂度都是O(1)二、问题分析设计一个辅助栈,以空间换时间,使得一批数据入栈后,可以获得这批数据的最小值。具体规则见《剑指Offer》P132三、解题算法1、栈结构的定义/************************************************a...原创 2018-07-01 15:50:52 · 158 阅读 · 0 评论 -
22--给栈的压入和弹出序列,判断弹出序列是否为压入序列出栈的一种
一、问题描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的其中一种弹出顺序。假设压入站的所有数字均不相等。【例如】序列1、2、3、4、5是某栈的压入序列,则序列4、5、3、2、1是该压栈序列对应的其中一个弹出序列序列 4、3、5、1、2不是该压栈序列对应的其中一个弹出序列二、题目分析判断一个序列是不是栈的弹出序列的规律:1)如果下一个弹出的数字刚好是栈顶数字,那么直接...原创 2018-07-01 15:53:44 · 223 阅读 · 0 评论 -
8-使用辅助内存的排序-O(n)
一、题目描述实现一个排序算法,要求时间复杂度为O(n)。情景:公司共有几万名员工,想对公司所有员工的年龄(数字范围较小0-99)排序,可以使用常量大小的辅助空间,不得超过O(n)二、解题思路1)申请一个长度为100的数组timesofAges[100]--初始值赋0,用于记录在年龄ages数组中该年龄出现的次数:timesofAges[age]=times--(键是年龄,存储的时候就是从小到大,值...原创 2018-06-29 10:23:32 · 381 阅读 · 0 评论 -
9-斐波拉契数列解法归纳
一、题目描述写一个函数,输入n,求斐波拉契数列的第n项。斐波拉契数列定义如下:f(n) = { 0 n=0 1 n=1 f(n-1)+f(n-1) n>1 }二、解题思路【解法一】常规递归不足:此法不推荐,原因是会产生大量重复的计算,而且重复的结点会随着n的增大而急剧增加。事实上...原创 2018-06-29 10:20:22 · 359 阅读 · 1 评论 -
30-寻找最小的k个数
问题描述 有n个整数,找出其中最小的k个数,时间复杂度尽可能低解决这道问题有很多种方法,最常见的解法笔者认为有两大类,第一类是全排序,第二类是部分排序。 1. 在全排序中,复杂度较低的,对于数量比较大的数据集而言,可以考虑采用快速排序和堆排序,复杂度O(nlogn)。对于数量比较小的数据集而言,可以考虑其他排序方式,比如插入排序。 2. 对于部分排序,题目没有要求最小的k个数有序,也没有要原创 2017-11-18 12:24:51 · 752 阅读 · 0 评论 -
29-出现次数超过一半的数的查找
【题目描述】 数组中有一个数出现的次数超过了数组长度的一半,找出这个数【解题方法】1、若数组有序: 方法:可直接输出数组n/2位置上的元素即可2、若数组无序 方法一:排序 采用快速排序,将无序数组变成有序数组,再输出n/2位置上的元素即可,复杂度为O(nlogn); 方法二:哈希表 1)根据题目需求,可设计出哈希表的数据结构(两个int,...原创 2018-02-25 21:54:17 · 1293 阅读 · 0 评论 -
28-n皇后问题
leetcode52. N-Queens II一、问题描述n皇后拼图是将n个皇后放在n * n棋盘上的问题,使得没有两个皇后互相攻击--不能同行同列同斜线。【需求】给定一个整数n,返回n皇后拼图的所有不同的解决方案。每个解决方案都包含n皇后位置的独特摆放情况,其中'Q'和'.' 两者分别指示女王和空闲空间。【举例】输入: 4 ------------- 输出: 2[ [".Q..", //...原创 2018-05-14 11:14:05 · 246 阅读 · 0 评论