剑指offer
practicePLUS
你的目标到底是什么
展开
-
剑指offer 把数字转换成字符串(动态规划)
题目:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成“a”,1翻译成“b”,·······,25翻译成“z”。一个数字可能有多个翻译。例如,12258有5种不同的翻译,分别是“bccfi”、"bwfi"、"bczi"、"mcfi"和"mzi"。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。思想:本题可以用自上而下(即从前往后递归的方式),将12258分为1, 2258...原创 2018-08-08 22:37:41 · 453 阅读 · 0 评论 -
剑指offer 43 1~n整数中 1出现的次数
题目描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。思路1:算出数字n中1的个数,遍历1~n,时间复杂度O(nlogn)代码:class Solution {p...转载 2018-06-10 22:24:22 · 125 阅读 · 0 评论 -
剑指offer 25 lintcode165. 合并两个排序链表
将两个排序链表合并为一个新的排序链表样例给出 1->3->8->11->15->null,2->null, 返回1->2->3->8->11->15->null。思想:因为两个链表均是排好序的,因此只需要新建一个链表,将两个链表进行大小对比后,存放在新链表中即可。注意:两个链表不同长度的处理方法。1、非递归程序:/** * Definition o转载 2018-05-29 15:47:23 · 187 阅读 · 0 评论 -
剑指offer 23 lintcode带环链表 II
给定一个链表,如果链表中存在环,则返回到链表中环的起始节点,如果没有环,返回null。您在真实的面试中是否遇到过这个题?Yes样例给出 -21->10->4->5, tail connects to node index 1,返回10分析:惊到我了代码: class Solution {public: ListNode *detec...转载 2018-01-19 20:17:17 · 209 阅读 · 0 评论 -
剑指offer 18 lintcode 112. 删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素每个元素只留下一个。样例给出 1->1->2->null,返回 1->2->null给出 1->1->2->3->3->null,返回 1->2->3->null思想:通过比较前一个结点值与后一个结点值是否相等,来决定当前结点指向后一个结点or后一个结点的后一个结点程序:* Definition of ListNode转载 2018-05-29 15:39:10 · 162 阅读 · 0 评论 -
剑指offer 17 打印从1到最大的n位数
题目:输入数字n,按顺序打印从1到最大的n位十进制数。比如输入3,则打印出1,2,3一直到最大的三位数999。思路:这里由于没有规定n的取值范围,我们需要考虑当n很大时,使用int 、long long 都会溢出的情况。并不是简单的计算出最大的n位数,再打印。那么最常用的方法就是用字符串或者数组来表示一个大数。因为数字最大是n位,我们需要一个长度为n+1的字符串(字符串最后一位是结束符'\0')。...原创 2018-06-18 17:30:19 · 242 阅读 · 0 评论 -
剑指offer 16 数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。(编程时不能使用库函数)分析:1、首先要考虑基数base是否等于0,等于零时,其exponent次方是无意义的,所以等于零或者等于1都无所谓2、考虑exponent的正负。当exponent为负时,最后结果要取倒数3、当base==0,并且expinent为负数时,就是0作了除数,...原创 2018-06-18 14:56:33 · 177 阅读 · 0 评论 -
剑指offer 15 二进制中1的个数
位运算:左移运算符m<<n表示把m左移n位。在左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0例如:00001010<<2=0010100010001010<<3=01010000右移运算符与左移类似,但右移时处理最左边位时稍微复杂:1、如果数字是一个无符号数值,则用0填补最左边的n位2、如果数字是一个有符号数值,则用数字...原创 2018-06-18 13:14:42 · 171 阅读 · 0 评论 -
键剑指offer 41 数据流中的中位数
转载http://blog.csdn.net/quzhongxin/article/details/47208927题目: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。思路解析数据是从数据流读出,因此数组的个数是再逐渐的增加。如何选用一个容器,能够存储数据...转载 2018-06-09 21:15:11 · 218 阅读 · 0 评论 -
剑指offer 40 最小的K个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4.思路:1、第一个思路肯定是通过排序,之后返回前k个数即可,时间复杂度O(nlogn);2、利用Partition 的思想。找出划分位置index,index 前的数均比它小,index后的数均比它大。比较index与k-1的大小,决定下次划分的区间。当in...原创 2018-06-09 19:43:22 · 271 阅读 · 0 评论 -
剑指offer 39 数组中出现次数超过一半的数字 (与lintcode46、47 主元素相同)
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。...原创 2018-06-08 21:05:03 · 243 阅读 · 0 评论 -
剑指offer 4 二维数组中的查找
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。...原创 2018-06-08 17:15:34 · 123 阅读 · 0 评论 -
leetcode 198 打家劫舍 (一维动态规划、基础)
转自:https://mp.weixin.qq.com/s?src=11×tamp=1528981756&ver=938&signature=WYEnOuwpBwSb-oFva2oX1M7Y-6ATjMYgPp3E-FtFu8gjBLCNcuiAC4B5DNjgRFKGKkFAbZSRzWO*cD*k9o7G5tp5DUvl3*F-zy9ua6U9JgGoAluGKRMBNpARO...转载 2018-06-14 22:27:04 · 3432 阅读 · 4 评论 -
剑指offer 14 剪绳子(动态规划和贪婪算法)
使用动态规划题的特征:1、面试题通常是求一个问题的最优解(通常是求最大值或者最小值)2、该问题可以分解成若干个子问题,并且子问题之间还有重叠的更小的子问题。思路:1、分析能否将大问题分解成小问题,且分解后的小问题也存在最优解2、如果把小问题的最优解组合起来能够得到整个问题的最优解,则可以使用动态规划题目:给你一根长度为n的绳子,请把绳子剪成m段(m,n都是整数,m>1,n>1),每段绳...原创 2018-06-15 18:15:45 · 467 阅读 · 0 评论 -
剑指offer 13 机器人的运动范围(回溯法)
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路:这种问题用回溯法认真分析最终条件,最终条件...原创 2018-06-14 20:17:03 · 220 阅读 · 0 评论 -
剑指offer 19 正则表达式匹配
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a...原创 2018-06-18 21:06:21 · 853 阅读 · 0 评论 -
剑指offer 20 表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。思路:首先必须知道这些表示法的规则:表示数值的字符串遵循原创 2018-06-19 09:51:33 · 258 阅读 · 0 评论 -
剑指offer 21 调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:1、如果此题没有要求 保证奇数和奇数,偶数和偶数之间的相对位置不变。可以用双指针解决2、有了这个要求,就要相对麻烦一些思路1:利用新的数组,空间换时间class Soluti...原创 2018-06-19 11:24:06 · 133 阅读 · 0 评论 -
剑指offer 不用加减乘除做加法
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。输入:输入可能包含多个测试样例。对于每个测试案例,输入为两个整数m和n(1<=m,n<=1000000)。分析:(1)十进制加法分三步:(以5+17=22为例)1. 只做各位相加不进位,此时相加结果为12(个位数5和7相加不进位是2,十位数0和1相加结果是1);2. 做...原创 2018-08-06 19:43:26 · 211 阅读 · 0 评论 -
剑指offer 求1+2+3+......+n
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。class Solution {private: int result=0;public: int Sum_Solution(int n) { if(n==0) return 0; ...原创 2018-08-06 16:21:23 · 161 阅读 · 0 评论 -
剑指offer 1 赋值运算符函数
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数class CMyString{ public: CMyString(char*pData=NULL); CMyString(const CMyString&str);//拷贝构造 CMyString&operator=(const CMyString&str)...原创 2018-08-09 21:15:22 · 172 阅读 · 0 评论 -
剑指offer 47 礼物的最大价值
题目描述 在一个 m*n 的棋盘的每一个格都放有一个礼物,每个礼物都有一定价值(大于 0)。从左上角开始拿礼物,每次向右或向下移动一格,直到右下角结束。给定一个棋盘,求拿到礼物的最大价值。例如,对于如下棋盘1 10 3 8 12 2 9 6 5 7 4 11 3 7 16 5 礼物的最大价值为 1+12+5+7+7+16+5=53。剑指offer答案: 思路:动态规划...原创 2018-08-09 19:59:04 · 581 阅读 · 0 评论 -
剑指offer 48 最长无重复字符的子字符串
给定一个字符串,请找出其中无重复字符的最长子字符串。样例例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为3。对于,"bbbbb",其无重复字符的最长子字符串为"b",长度为1。挑战O(n) 时间分析:这里是子串,不是子序列,所以必须是连续的。如果给一个例子中的例子"abcbd",让你手动找无重复字符的子串,该怎么找。我们肯定会一个字...原创 2018-08-09 18:19:25 · 327 阅读 · 0 评论 -
剑指offer 44 数字序列中某一位的数字(类似题43)
题目描述 数字以01234567891011121314…的格式序列化到一个字符序列中。在这个序列中,第5位是5(从0开始),第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。分析:最直观的方法就是从0开始逐一枚举每个数字。每枚举一个数字,就求出该数字是几位数,并把该数字的位数和前面所有数字的位数累加。如果位数之和仍然小于或者等于输入n,则继续枚举下一...原创 2018-08-09 16:56:58 · 482 阅读 · 0 评论 -
剑指offer55 lintcode 93 平衡二叉树
描述给定一个二叉树,确定它是高度平衡的。对于这个问题,一棵高度平衡的二叉树的定义是:一棵二叉树中每个节点的两个子树的深度相差不会超过1。 样例给出二叉树 A={3,9,20,#,#,15,7}, B={3,#,20,15,7}A) 3 B) 3 / \ \ 9 20 ...原创 2018-07-07 19:10:32 · 131 阅读 · 0 评论 -
剑指offer 18 在O(1)时间内删除链表的给定结点
给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该结点。分析:由于需要在O(1)时间内删除结点,所以从头遍历找到结点,并删除的做法,时间复杂度显然是O(n),不符合题意正确思路:当确保所给结点在链表中时(面试时可以询问面试官)可以找到所要删除结点n的下一个结点n+1,并将n+1的值赋给n,之后再删除结点n+1,这样就可以保证时间复杂度是O(1)啦注意:如果所要删除的结点n是尾结...原创 2018-07-12 21:06:18 · 116 阅读 · 0 评论 -
剑指offer 33 二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。分析:如输入数组{5,7,6,9,11,10,8},则返回true。抓住后序遍历序列的特点,最后一个数字是根结点,序列中从某一结点往后均比它大,从这一结点往前均比它小,利用递归,找出不符合条件的,返回false,如果没有,则返回true.代码:class Sol...原创 2018-07-09 16:31:53 · 169 阅读 · 0 评论 -
剑指offer 29 顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.思路:容易绕晕 1、我们可以总结出规律,每圈的左上角坐...原创 2018-06-19 21:22:16 · 153 阅读 · 0 评论 -
剑指offer 42 lintcode41. 最大子数组, 最小子数组(贪心法)
给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。样例给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6类似说法面试题目:公司给予你一次投资股票的机会,且已知股票的变化曲线图。希望你做出利益最大化选择以下为简化信息:a[] = {100, 113, 110, 85转载 2018-05-29 15:32:49 · 451 阅读 · 0 评论 -
剑指offer 67 把字符串转换成整数
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0示例1输入复制+2147483647 1a33输出复制2147483647 0先介绍一下atoi函数...原创 2018-06-19 17:54:30 · 415 阅读 · 0 评论 -
剑指offer 62 圆圈中最后剩下的数字
题目:其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个...原创 2018-06-19 16:29:04 · 273 阅读 · 0 评论 -
剑指offer 61 扑克牌中的顺子
题目:从扑克牌中(54张)随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大王,小王可以看成任意数字。思路:将大王小王看成01、将数组排序(用sort函数(时间复杂度O(nlogn)),因为数据不是很大,所以n和nlogn的时间复杂度不会相差很大)2、统计数组中0的个数3、统计数组中空缺的个数(注意要避开0)4、检查数组中是否...原创 2018-06-19 15:26:46 · 220 阅读 · 0 评论 -
剑指offer 12 矩阵中的路径 (回溯法)
回溯法:适合解决由多个步骤组成的问题,并且每个步骤都有多个选项。当我们在某一步选择了其中一个选项时,就进入下一步,然后又面临新的选项。就这样重复选择,直至到达最终的状态。用回溯法解决的问题的所有选项可以形象的用树状结构表示。在某一步有n个可能的选项,该步骤可以看成是树状结构中的一个结点,每个选项看成是树中结点连接线。树的叶结点对应着终结状态。1、如果在叶结点的状态满足题目的约束条件,那...原创 2018-06-14 17:18:06 · 284 阅读 · 0 评论 -
剑指offer 59 滑动窗口的最大值以及 队列流中的最大值
题目描述给定一个数组A[],有一个大小为w的滑动窗口,该滑动窗口从最左边滑到最后边。在该窗口中你只能看到w个数字,每次只能移动一个位置。我们的目的是找到每个窗口w个数字中的最大值,并将这些最大值存储在数组B中。例如数组A=[1 3 -1 -3 5 3 6 ], 窗口大小w为3。则窗口滑动过程如下所示:Window position Max--------------- ...原创 2018-06-14 15:31:18 · 240 阅读 · 0 评论 -
8题 剑指offer 二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路1:1、如果这个结点有右子树,则其下一个结点就是右子树的最左结点。 2、如果这个结点没有右子树,则如果这个结点是其父节点的左结点,那么父节点就是这个结点的下一个结点 ...转载 2018-05-29 15:20:06 · 91 阅读 · 0 评论 -
27剑指offer 二叉树的镜像(递归和非递归(使用栈)的方法)
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5思路: ...转载 2018-05-29 15:19:30 · 166 阅读 · 0 评论 -
26 剑指offer:树的子结构(注意思考递归结束条件是什么。)
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:第一步,首先找到A中与B根结点相等的结点node。第二部,判断以node为根结点的子树与B是否相等。代码:class Solution {public: // 判断pRoot2是否是pRoot1的子结构(两个树根结点不一定相同,需要先判断根结点) bool HasSubtree(Tr...转载 2018-05-29 15:18:54 · 252 阅读 · 0 评论 -
28 剑指offer 对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。分析:还是画图分析,先画以下两幅图进行分析和讨论:显然,两颗数结构上是对称的,但是数字上第二幅不是,所以只要是第一幅图这种情况就是对称的,我们来分析怎么用代码思想表述它。提到二叉树,想到的就是三种不同二叉树的遍历方法,即前序遍历、中序遍历和后序遍历。在这三种遍历算法中,都是先遍历左...转载 2018-05-29 15:18:20 · 110 阅读 · 0 评论 -
34 剑指offer 二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。注意:路径必须是从根结点开始到叶结点结束的。思路:由于要先遍历根结点,因此使用前序遍历,根据遍历特性,当某一结点不满足时,需将他剔除,需满足后进先出特性。这里我们使用vector实现栈。利用push_back()在末尾添加结点。利用pop_back()...转载 2018-05-29 15:17:35 · 92 阅读 · 0 评论 -
36剑指offer 二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。由于要求转换成一个排序的双向链表,因为二叉搜索树的中序遍历就是有序的,因此遍历过程中可以使用中序遍历。分析与解法: 首先 我们知道:在二叉树中,每个结点都有两个指向子结点的指针。在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点。观察...转载 2018-05-29 15:16:42 · 155 阅读 · 0 评论