剑指offer c++版
文章平均质量分 70
YF_Li123
生活需要奔跑
展开
-
剑指offer(C++)——链表中环的入口结点
题目描述一个链表中包含环,请找出该链表的环的入口结点struct ListNode { int val; struct ListNode *next; ListNode(int x) :val(x), next(NULL) {}};/*思路:设置两个指针p1和p2,如果链表中有n个结点,指针p1先向前移动n个结点,然后两个指针以相同速度向前移动,当两个指针相原创 2017-04-18 11:17:58 · 977 阅读 · 0 评论 -
剑指offer(C++)——替换空格
题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:简单暴力解法,从头到尾遍历字符串,碰到空格,首先将后面的所有字符串往后移动2个字符,才能空出3个字符位子插入字符“%20”,对于一个长度为n的字符串,对每个空格,需要移动后面O(n)个字符,因此包含n个空格的字符串,原创 2017-04-21 17:08:47 · 2440 阅读 · 0 评论 -
剑指offer(C++)——从尾到头打印链表
题目描述输入一个链表,从尾到头打印链表每个节点的值。思路:(1)由于链表只能从头到尾进行遍历,于是我们就想如果能把链表的指针翻转过来,我们就可以实现从尾到头的输出了。但是这里有个问题,就是我们这样做会改变原始链表的结构。如果没有要求说不能改变链表的结构,那么我们就可以采用头插法来实现翻转链表。(2)如果要求不能改变原始链表结构怎么办呢?在遍历链表的时候,我们可以借用原创 2017-04-21 20:48:56 · 1020 阅读 · 0 评论 -
剑指offer(C++)——重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:根据前序遍历的特点,第一个数字1就是根结点。扫描中序遍历序列,就可以确定根结点的位置。根据中序遍历的特点,根结点1前面的3个数都是左子原创 2017-04-22 11:02:58 · 596 阅读 · 0 评论 -
剑指offer(C++)——用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:(1)插入:我们知道栈是一个“先进后出”的数据结构,而队列是一个“先进先出”的数据结构。现在要求用两个“先进后出”的栈来实现一个“先进先出”的队列。现在我们通过一个具体实例来分析如何实现。首先插入一个元素a,不妨先把它插入到stack1中,此时stack1中只有{a}。接着在插原创 2017-04-22 11:24:45 · 1417 阅读 · 0 评论 -
剑指offer(C++)——旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路分析:最直观的解法就是从头到尾遍历一遍数组,找出最小数字。时间复杂度原创 2017-04-23 21:23:08 · 1296 阅读 · 0 评论 -
剑指offer(C++)——二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路分析:解法1:如果不考虑时间效率,使用除法,依次统计二进制中1的个数/*时间复杂度大,效率低,只能处理正数,不能处理负数*/ int NumberOf(int n) { int count = 0; while (n) { if (n % 2 == 1) cou原创 2017-04-24 08:50:04 · 1541 阅读 · 0 评论 -
剑指offer(C++)——变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。原创 2017-04-24 20:15:14 · 592 阅读 · 0 评论 -
剑指offer(C++)——跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:首先我们考虑最简单的情况。如果只有1级台阶,显然只有一种跳法。如果只有2级台阶,则有两种:一种是一次跳1级,一种是一次跳2级接着考虑一般情况,对于n级台阶,我们记跳法总数为f(n)。当n>2时,第一次跳有两种选择,一种是跳1级台阶,此时跳法数目等于后面剩下的n-1原创 2017-04-24 20:38:32 · 1888 阅读 · 0 评论 -
剑指offer(C++)——斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n思路:解法1:大家最熟悉的递归解法就不详述了,直接上代码:/*递归解法,时间复杂度很大*/ int Fibonacci(int n) { if (n == 0) return 0; if(n==1) return原创 2017-04-24 20:03:35 · 992 阅读 · 0 评论 -
剑指offer(C++)——矩阵覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路:第一个2*1的小矩阵有两种覆盖方法:一种是竖着放,此时总的覆盖方法等于剩下的n-1个2*1的大矩形的覆盖方法;另一种是横着放,此时需要另一个2*1的小矩形也必须横着放,此时总的覆盖方法等于剩下的n-2个2*1的大矩形的覆盖方法。总的方原创 2017-04-24 21:04:28 · 955 阅读 · 0 评论 -
剑指offer(C++)——二维数组中的查找
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数思路:二维数组中查找是否包含某个整数,直接的做法就是进行暴力搜索,但是这样做的时间复杂度为O(n*n),效率很低。而且也没有充分利用本题中二维数组递增的特点。根据数组递增的特点,我们会发现如下规律:首先选取数组中原创 2017-04-21 15:15:02 · 514 阅读 · 0 评论 -
剑指offer(C++)——机器人的运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路:类似于面试题66,,详细可原创 2017-04-20 20:23:50 · 1820 阅读 · 0 评论 -
剑指offer(C++)——数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。思路:由于数据是从数据流中读取出来的,数据的个数随着时间的变化而增加。因此我们需要一个数据容器来保存读取出来的数据。解法1:用数组来保存数据。如果数组无序,则找到中位数最优的算法时间原创 2017-04-19 19:02:45 · 2768 阅读 · 0 评论 -
剑指offer(C++)——字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。/*思路:由于字符只能从字符流中一个一个读取,可以定义一个哈希表来保存字符在字符流原创 2017-04-18 10:28:57 · 825 阅读 · 0 评论 -
剑指offer(c++)——删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5struct ListNode { int val; struct ListNode *next; ListNode(int x) :val(x), next(NULL) {}原创 2017-04-18 15:16:37 · 1284 阅读 · 0 评论 -
剑指offer(C++)——重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。/** * Definition for binary tree * struct TreeNode { * int val;原创 2017-04-28 20:58:29 · 1043 阅读 · 1 评论 -
剑指offer(C++)——对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) :val(x), left(NULL), right(NULL)原创 2017-04-18 19:58:08 · 518 阅读 · 0 评论 -
剑指offer(C++)——按之字形顺序打印二叉树
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。/*思路:打印第一层结点的时候要把第二层结点保存到一个容器里,由于打印第二层结点的顺序是从右至左,容器为后进先出,故容器为栈打印第一层时,依次把第一层的左子结点和右子结点保存到栈中;打印第二层结点时要把第三层结点保存原创 2017-04-18 20:57:11 · 1484 阅读 · 0 评论 -
剑指offer(C++)——把二叉树打印成多行
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。/*思路:对二叉树进行层次遍历,利用一个队列来保存将要打印的结点。为了把二叉树的每一层结点单独打印到一行,需要设置两个变量:一个表示当前层中还没有打印的结点数(currentLevels),另一个表示下一层结点的数目(nextLevels)*/struct TreeNode { int v原创 2017-04-19 08:43:49 · 1817 阅读 · 0 评论 -
剑指offer(C++)——序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树解释:序列化的意思是指将一些特定的数据结构,变成有格式信息的字符串。例如对一个链表,可以将1->2->3->4->NULL序列化为"1,2,3,4"。对于序列化算法,必须支持反序列化,即在约定的格式下,可以将满足格式要求的字符串重新构造为原始的结构形式。二叉树序列化 我们以前序原创 2017-04-19 09:52:59 · 2620 阅读 · 2 评论 -
剑指offer(C++)——二叉搜索树的第k个结点
题目描述给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 按结点数值大小顺序第三个结点的值为4。思路:根据二叉搜索树的特点,中序遍历的数值是递增排序的,因此,只需中序遍历二叉搜索树就能找到第k大结点。如上面的二叉树,中序遍历结果为 {2,3,4,5,6,7,8},第三个结点的值为4/*思路:根据二叉搜索树的特点,中序遍原创 2017-04-19 10:39:03 · 1397 阅读 · 0 评论 -
剑指offer(C++)——滑动窗口的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],原创 2017-04-20 11:14:38 · 3359 阅读 · 0 评论 -
剑指offer(C++)——矩阵中的路径
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如[a b c e s f c s a d e e]是3*4矩阵,其包含字符串"bcced"的路径,但是矩阵中不包含“abcb”路径,因为字符串的第一原创 2017-04-20 15:05:54 · 2470 阅读 · 0 评论 -
剑指offer(C++)——二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode *right; struct TreeLinkNode *next; Tree原创 2017-04-18 16:22:37 · 728 阅读 · 2 评论