![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++剑指offer
starflyyy
这个作者很懒,什么都没留下…
展开
-
剑指offer:替换空格
剑指offer:替换空格问题:实现一个函数,将字符串中的每个空格替换成"%20""。如:输入“We are happy.”, 则输出 "We%20are%20happy"首先有两种方式:一是在原来的字符串上面进行替换,就有可能覆盖子啊该字符串后面的内存。另一种是创建新的字符串进行替换,那么可以分配足够多的内存。现在主要考虑第一种方式。思路:1.从前...原创 2019-07-02 17:12:49 · 80 阅读 · 0 评论 -
剑指offer:删除链表中重复的节点
剑指offer:删除链表中重复的节点参考博客删除链表中重复的节点题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。思路:首先检查边界条件(链表有0个节点或链表有1个节点),返回头节点。其次为了避免由...转载 2019-07-16 22:36:47 · 170 阅读 · 0 评论 -
剑指offer:表示数值的字符串
剑指offer:表示数值的字符串题目: 实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2", "-123","3.1416","-1E-16"。思路:1.使用正则表达式 2.普通方法正则表达式的讲解具体的坑见代码!class Solution {public: // bool isNumeri...原创 2019-07-19 20:56:25 · 101 阅读 · 0 评论 -
剑指offer: 找到包含环的链表的入口结点
剑指offer:找到包含环的链表的入口结点题目: 如果一个链表包含环,如何找出环的入口结点。分析:1.确定一个链表中包含环 使用两个指针,一个指针每次走一步,另一个走两步,如果走的 快的指针追上了走的慢的,那么链表就包含环,如果走的快的指针 走到了末尾还没有追上,那么就不含环。 2.确定入口 使...原创 2019-08-14 11:19:02 · 80 阅读 · 0 评论 -
剑指offer: 排序链表的合并
剑指offer:排序链表的合并直接使用递归解决。class Solution {public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if (pHead1 == nullptr && pHead2 == nullptr) return nullptr; if (pH...原创 2019-08-14 11:20:53 · 81 阅读 · 0 评论 -
剑指offer: 复杂链表的复制 + 二叉搜索树与双向链表
复杂链表的复制:题目: 在复杂链表中,每个节点除了有一个 next 指针指向下一个结点,还有一个 random 指针指向链表中的任意结点或者nullptr。分析: 首先复制原始链表上的每个节点,使用next指针相连。然后设置每个节点的 random 指针,设结点N指向结点S,定位 S 的位 置需要从原始链表的头结点开始找。如果从原始链表的头结点经过s步找到S,那么在复制链表上结点N'的S...原创 2019-08-19 12:10:37 · 97 阅读 · 0 评论 -
剑指offer:树的子结构、二叉树的镜像、对称的二叉树
剑指offer:树的子结构、二叉树的镜像、对称的二叉树题目: 树的子结构: 输入两棵二叉树A和B,判断B是不是A的子结构。 分析: 1. 查找树A中与树B根节点一样的结点(树的遍历)。 2. 判断A中以该结点为根节点的子树是不是和B具有一样的结构。 注:在写树的代码的时候,要时刻注意该地址是否可能是nullptr/*s...原创 2019-08-15 10:40:46 · 86 阅读 · 0 评论 -
剑指offer——牛客网怎么用、怎么在Dev中调试代码
此文用来帮助刚入坑剑指offer的 小可爱 顺利使用牛客网进行练习。1. 搜索 剑指offer牛客网 进入页面。2. 搜索相应题目进入提交页面可以看到左边是题目,右边是提交页面。牛客网提供的这个接口会让萌新感到很疑惑,接下来展示怎么在Dev C++中使用。3. 将右边的内容复制,粘贴到Dev C++中并添加相应的库函数(别忘了 using namespace ...原创 2019-08-15 11:19:37 · 4579 阅读 · 0 评论 -
剑指offer:调整数组顺序使得奇数位于偶数的前面
题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数 位于数组的前半部分,所有偶数位于数组的后半部分。思路: 1. 从头到尾扫描数组,每碰到一个偶数,拿出一个数字,并把位于这个数字后面的 所有数字向前挪动一位。挪完之后的数组的末尾有一个空位,这时把偶数放入这个空位。 由于每次碰到一个偶数需要移动O(n)个数字,因此总的时间复杂度是O...原创 2019-08-12 11:41:57 · 70 阅读 · 0 评论 -
剑指offer :字符串的排列
题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。c++ 中常用类 stringc++ 中 auto 关键字的用法c++ 中unique函数解析c++ 中sort函数的第三个参数c++ 查询某个变量的类型class Solution ...原创 2019-08-21 12:07:55 · 89 阅读 · 0 评论 -
剑指offer: 包含min函数的栈、栈的压入弹出序列
包含min函数的栈题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在 该栈中,调用min、push及pop的时间复杂 度都是O(1)。分析:使用辅助栈,每当加入一个新的元素,都将当前最小值压入辅助栈(辅助栈的栈顶总是当前所有元素中的最小元素)。class Solution {public: stack<int> stack_...原创 2019-08-16 12:24:50 · 85 阅读 · 0 评论 -
剑指offer:链表的倒数第k个结点
剑指offer: 链表的倒数第k个结点题目:输入一个链表,输出该链表中倒数第k个结点。 链表的尾结点是倒数第一个结点。 例如:一个链表有6个结点,从头结点开始,他们的值依次是: 1,2,3,4,5,6.这个链表的倒数第三个结点是值为4的结点思路: 1.为了得到倒数第k个结点,自然的想法是先走到链表的尾端,再从尾端向前回溯k步。...原创 2019-08-13 11:12:16 · 81 阅读 · 0 评论 -
剑指offer:反转链表
剑指offer:反转链表题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点分析: pNow: 当前结点 pPre: 当前结点的上一个结点 pNext: 当前结点的下一个结点 反转链表时,需要 pNow->next = pPre 但是直接这样的话,pNow->nex...原创 2019-08-13 11:26:36 · 96 阅读 · 0 评论 -
剑指offer:正则表达式匹配
剑指offer:正则表达式匹配题目:实现一个函数用来匹配包含' , ' 、' * ' 的正则表达式。模式中的' . '表示任意一个字符,而' * '表示它前面的字符可以出现任意次(含0次)在本题中,匹配指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a" 和"ab*ac*a"匹配,但和"aa.a"和"ab*a不相配"。思路:可以使用递归解决。将正则...原创 2019-07-18 22:41:50 · 134 阅读 · 0 评论 -
剑指offer:二进制中1的数目
剑指offer:二进制中1的个数题目:实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如,把9表示成二进制是1001,有两位是1,输出2.补充知识:左移运算符: m << n 表示把m左移n位。左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0.右移运算符: m >> n 表示把m右移n位。右移n位的时候,最右边的n位将被丢弃...原创 2019-07-12 11:12:25 · 78 阅读 · 0 评论 -
剑指offer:旋转数组的最小数字
剑指offer:旋转数组的最小数字题目:将一个数组最开始的若干个元素搬到数组的末尾,我们称为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。思路:1.最简单的是将数组循环一遍,这是O(n)的解法,不过没有用到旋转数组的特性,肯定不满足要求。2.注意到旋转后的数组...原创 2019-07-09 10:44:59 · 81 阅读 · 0 评论 -
剑指offer:数值的整数次方
剑指offer:数值的整数次方题目:实现函数 double Power(double base, int exponent),求base的exponent次方。不使用库函数,不需要考虑大数问题。思路:简单的一次次相乘,效率太低,可以采用二分的想法。对于一个exponent,可以分解成 2的幂次相加的形式。这种分解恰好对应了这个exponent的二进制形式。如图:如exp...原创 2019-07-13 11:06:58 · 92 阅读 · 0 评论 -
剑指offer:反向输出链表
剑指offer:反向输出链表思路:使用stack先进后出,恰好与题目要求反向输出相契合。实现:牛客网编程通过。class Solution {public: vector<int> printListFromTailToHead(ListNode* head) { vector<int> values; stack...原创 2019-07-04 11:26:36 · 159 阅读 · 0 评论 -
剑指offer:矩阵中的路径、机器人的运动范围
剑指offer:矩阵中的路径、机器人的运动范围题目:矩阵中的路径:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符路径。路径可以从矩阵的任一格开始,每一步可以在矩阵中向左右上下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。思路:深度优先搜索。实现:class Solution {public: bool hasP...原创 2019-07-10 11:34:58 · 118 阅读 · 0 评论 -
剑指offer:数组中重复数字
剑指offer:数组中重复的数字题目:一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字时重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应输出的重复的数字是2或3。思路:1.先将数组进行排序,然后从排序的数组中找出重复的数字。排序:O(nlogn)2.h...原创 2019-06-29 19:40:49 · 229 阅读 · 0 评论 -
剑指offer: 打印从1到最大的n位数
剑指offer: 打印从1到最大的n位数题目:输入数字n,按顺序打印从1到最大的n位十进制数。比如输入3,则打印出1、 2 、3 直到999。思路:1.利用字符串模拟数字的加法。2.采用全排列的思路,并使用递归实现全排列。实现:思路1:class Solution{public: void Print1ToMax(const int n){ ...原创 2019-07-14 16:35:00 · 126 阅读 · 0 评论 -
剑指offer:二维数组的查找
剑指offer:二维数组的查找问题:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下的顺序排序。请完成一个函数,输入这样的一个二维数组和整数,判断数组中是否有该整数。思路:1.首先可以判断该问题最差的算法是O(n^2),所以比这个方法更差的方法就不用考虑了。2.其次可以想到可以用到 广度优先搜索(BFS) 算法。3.最后是书上提供的思路,让人拍案叫绝:右上...原创 2019-06-30 17:14:41 · 154 阅读 · 0 评论 -
剑指offer:重建二叉树
剑指offer:重建二叉树题目:输入某二叉树的前序遍历和中序遍历的结果,重建该二叉树。设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如:输入的先序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5, 3, 8, 6}, 则重建该二叉树并输出头结点。使用 pre 表示先序遍历序列,使用vin表示中序遍历序列。思路:前序...原创 2019-07-05 17:05:23 · 97 阅读 · 0 评论 -
剑指offer: 二叉树的下一个节点
剑指offer:二叉树的下一个节点题目:给定一颗二叉树和其中的一个节点,找出中序遍历序列的下一个节点。树中的节点除了有两个分别指向左右子节点的指针,还有一个指向父节点的指针。中序遍历是按照左根右的顺序进行遍历的:若当前节点有右子树,那么它的有子树里面最左的第一个为下一个节点若当前节点没有右子树,则需要向parent回溯:若当前节点为其父节点的左节点,则它的下一个节点为...原创 2019-07-05 20:31:48 · 107 阅读 · 0 评论 -
剑指offer:剪绳子
剑指offer:剪绳子题目:有一根长度为n的绳子,请把绳子剪成m段(m,n都是整数,n>1且m>1),每段绳子的长度记为k[0],k[1],...k[m-1].请问k[0]×k[1]×...×k[m-1]的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2,3,3的三段,此时得到的最大乘积是18.思路:1.动态规划:O(n^2)的时间复杂度和O(n)的空...原创 2019-07-11 11:33:57 · 124 阅读 · 0 评论 -
剑指offer: 用两个栈实现队列
剑指offer:用两个栈实现队列我们知道栈是先进后出,而队列是先进先出, 所以想法也十分简单,使用两个栈,我们把第一个栈的元素"倒进"第二个栈就可以了。中间的疑问是,如果一边push,一边pop,会不会出问题。具体看图:将 stack1 中的元素倒入 stack2中。这时直接将 stack2中的元素输出,即可实现先进的元素先出。如果push( ), pop( )...原创 2019-07-06 10:27:55 · 85 阅读 · 0 评论 -
剑指offer:Fibonacci 数列
剑指offer:Fibonacci数列Fibonacci 数列由下式定义:思路:1.直接将上式转化为代码,使用递归的方式。缺点:效率太低,容易造成栈溢出。(可以看到有很多重复计算的)2.使用循环自下而上计算,时间复杂度是O(n).3.使用公式,这个方法的时间复杂度是O(logn),因为乘方运算可以使用递归每次算其的指数的一半。实现:方法2:cla...原创 2019-07-07 11:36:21 · 133 阅读 · 0 评论 -
剑指offer: 从上到下打印二叉树(三连问)
题目1:不分行从上到下打印二叉树 从上到下打印出二叉树的每个节点,同一层的结点按照从左到右的顺序打印。分析: 使用队列实现class Solution {public: queue<TreeNode*> queue_help; vector<int> PrintFromTopToBottom(TreeNode* root) {...原创 2019-08-17 11:01:13 · 86 阅读 · 0 评论