
剑指offer
yyyyyyyuande
这个作者很懒,什么都没留下…
展开
-
《剑指offer》c++版本 3.数组中重复的数字
如题: 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字 是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数 组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 方法由很多,四种,显然,排序法和哈希查找法都可以。第三种方法比较巧妙,利用了题目中数字都在0~n-1这个...原创 2019-10-30 17:27:01 · 315 阅读 · 0 评论 -
《剑指offer》c++版本 17.打印从1到最大的N位数
如题: 题意就是从1打印直到n位数的最大值,即999999999........。一看就是循环的逻辑。需要注意的地方,除了非法的n之外,就是大数问题了。n太大的话,啥类型都存储不了。普通的解法是使用一个长度为n的字符数组,然后循环对数组做加1操作,然后打印。逻辑不难,但这题有更好的解法。打印1到9999...,相当于打印N位数的全排列,这里用N层循环即可,无需处理加1操作,逻辑上更简单。 ...原创 2019-10-30 17:28:39 · 383 阅读 · 0 评论 -
《剑指offer》c++版本 15.二进制中1的个数
如题: 平常开发过程中,遇到求数的每位数字的时候,通常做法是将这个逐位右移,本题目计算整数的二进制中1的个数,通过右移的方式,能够解决部分问题,但是,这里有个坑,如果整数为负的话,右移后最左边还是1,如果是循环的话,容易引起死循环。举个例子:负数0x80000000,右移后不是0x40000000,而是0xC0000000,这是因为,移位后,仍要保证是负数,一直右移,最终得到0XFFFFFFFF...原创 2019-10-30 17:28:28 · 261 阅读 · 0 评论 -
《剑指offer》c++版本 14.剪绳子
本题在牛客网剑指offer专项里没看到,原书第二版上有,如题: 这道题是开放的动态规划题,题目中只给了绳子长度,却没定义具体剪多少段,初遇此题,难以下手,看了题解,豁然开朗。设f(n)为常为n的绳子剪成m段之后可得最大值,则存在n-1中减法,得f(n) = MAX(f(i) * f(n-i));初始值f(1),f(2),f(3)都可以计算出来,大于3则调用dp方程递归计算至n即可。 思路简...原创 2019-10-30 17:31:03 · 424 阅读 · 0 评论 -
《剑指offer》c++版本 13. 机器人的运动范围
如题: 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标 和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入 方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子? 这道题和第12题矩阵中的路径类似,都...原创 2019-10-30 17:28:10 · 390 阅读 · 0 评论 -
《剑指offer》c++版本 12. 矩阵中的路径
如题,牛客网上题目没有图示,下图是从原书中截图得到的。 本题就是从数组中按照指定方向查找字符序列,典型的回溯行为,找到当前字符,继续查找该字符上下左右四个方向,找不到,返回上一个字符,重新查找。题目要求,路径中不能访问同一个字符,可以创建一个等大小的bool二维数组,记录已访问的点,每次访问一个点,置标志位,注意。如果该点的后一个结点不符合,再返回上一个节点前,需要去掉该标志位。 使用递归...原创 2019-10-30 17:28:04 · 468 阅读 · 0 评论 -
《剑指offer》c++版本 11. 旋转数组的最小数字
如题: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 题意就是数组中查找最小值,最直接的方法就是排序后得到最小值,但是题目已经指明,数组为非递减数组。有序数组查...原创 2019-10-30 17:27:56 · 366 阅读 · 0 评论 -
《剑指offer》c++版本 10. 斐波那契数列
如题: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 这道题基本上学过算法的人都直到,斐波那契数列即,即1,1,2,3,5....... 用数学公式描述即 f(n) = f(n-1) + f(n-2),很多教科书上都提供了递归算法,虽然,能够满足,但是效率是在太低了,存在大量重复计算,比如,计算f(5)的时候,需要计算f(4)和f(...原创 2019-10-30 17:27:51 · 285 阅读 · 1 评论 -
《剑指offer》c++版本 9. 用两个栈来实现一个队列
如题: 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 本题考察对数据结构队列,栈的理解。队列的特点是FIFO,先进先出。栈的特点是FILO,先进后出。题目要求我们使用两个栈来实现队列的操作,一开始不懂没关系,可以模拟下入队、出队的动作。 假设,先入队1,2两个元素,存储到stack1,栈顶为2,这时候要出栈,按照队列规则,应该1先出,怎么办呢?很明显...原创 2019-10-30 17:27:45 · 274 阅读 · 0 评论 -
《剑指offer》c++版本 8.二叉树的下一个结点
如题: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点 的指针。 这道题目考察对二叉树中序遍历的理解,做题的时候,如果没有思路,简单画画图,可以帮助理解。 上图没有画出指向父节点的指针,不过,不妨碍分析问题。已知节点,求中序遍历后一个节点。 如果节点存在右子树,显然,后一个节点位于右子树上最左边位置,递归...原创 2019-10-30 17:35:44 · 313 阅读 · 0 评论 -
《剑指offer》c++版本 5.替换空格
如题: 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之 后的字符串为We%20Are%20Happy。 这道题难度不大,替换空格,字符串长度边长,需要知道变多长,这时候需要统计空格个数。知道最终字符串长度后,将源字符串从后往前复制到新字符串对应位置即可。编码的时候需要检查输入参数是否合法。 //计算str长度,然后统计空...原创 2019-10-30 17:27:25 · 283 阅读 · 0 评论 -
《剑指offer》c++版本 4.二维数组中的查找
如题: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照 从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 非常有趣的一题。题目意思就是从数组中查找指定的数,普通的暴力法,循环遍历数组,可以求取答案,但是效率太低,没有利用题目给的条件。从左到右递增,从上到下递增,如果从左上角[0][0]点开始...原创 2019-10-30 17:27:19 · 298 阅读 · 0 评论 -
《剑指offer》c++版本 7.重建二叉树
如题: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和 中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序 遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 根据前序和中序数列重建二叉树,这道题,还有一道类似题,根据后续和中序数列重建二叉树。两题解法完全一样,仅仅方向不同。这是学习二叉树的时候必做...原创 2019-10-30 17:27:40 · 271 阅读 · 0 评论 -
《剑指offer》c++版本 6.从尾到头打印链表
如题: 题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 刚到手,想到的是反转链表,然后顺序打印。不过这样会改变原有链表。不过这道题最好的解法是利用递归或者栈,一样的道理。遍历链表,从尾到头,听起来和栈的元素访问顺序一致。因此,可以遍历链表,元素入栈,然后再出栈访问即可。此为方法1. 方法2是使用递归,先访问下一个元素,再访问自身。值得注意的是,凡是递归写法,一般都...原创 2019-10-30 17:27:37 · 325 阅读 · 0 评论 -
《剑指offer》c++版本 18.删除链表的结点
如题: 这道题要求在O(1)时间内删除链表节点。 常规解法是遍历链表,找到所需元素,使其前继节点的next指针指向待删节点的next指针,时间复杂度位O(n),不满足要求。除了遍历之外,还有一种更好的办法删除结点,如果结点存在后继元素的话,可以直接将后继元素所有值复制到待删元素,这时候直接删除后继即可,如果位于尾节点,则遍历链表,对于链表中只有一个元素的情况,这时候,待删结点即是头节点又是...原创 2019-10-30 17:28:48 · 295 阅读 · 0 评论