常见问题的代码实现
MaiDang_
进阶的小菜鸟
展开
-
找出中序遍历顺序的下一个结点
问题描述: 给定一颗二叉树和其中一个节点,找出中序遍历序列的下一个节点!树中的每个节点有 左/右/父 三个指针域。提示:不是所有的节点都有其下一个节点,所以结果可能为 NULL 根节点的父节点为 NULL节点的定义如下:struct TreeLinkNode { int val; struct TreeLinkNode *left; st...原创 2019-05-20 13:47:07 · 1040 阅读 · 0 评论 -
快排--快排一次划分的应用 & O(n)复杂度的排序
快排:快排一次划分的应用: 1. 长度为n的数组的中查找第 k大的数字 2.长度为n的数组的中查找前 k大的数字,等等O(n)复杂度的排序:例题: 某公司几万名的员工,现对员工的年龄进行排序,复杂度要求为O(n),提示,可以使用 常量级别的辅助空间。分析: 由于是年龄的排序,那么可以申请一个数组,...原创 2019-05-21 17:38:02 · 635 阅读 · 0 评论 -
旋转数组的最小数字
题目: 把一个数组最开始的若干个数字搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如:{3,4,5,1,2} 为数组 {1,2,3,4,5}的一个旋转,该数组的最小值为 1.分析; 1. 可以从头遍历一遍,但是没有使用到递增数组这个条件,不是最优复杂度的解 2. 可以仿照二分查找的思想,使得复杂...原创 2019-05-21 18:34:02 · 163 阅读 · 0 评论 -
动态规划
适用于动态规划解决的问题所具有的特点:1、求得一个问题的最优解2、整体问题的最优解依赖于子问题的最优解3、把大问题划分为若干小问题,这些小问题还有相互重叠的更小的子问题4、问题可以自上而下分析,要从下而上求解。题目一: 一段长为n的绳子,把绳子剪为m段(m,n都是整数,n>1 并且 m>1),每段绳子的长度记为 K0,K1,...,Km。...原创 2019-05-21 22:57:03 · 162 阅读 · 0 评论 -
回溯法
回溯法: 回溯法可以视作蛮力法的升级版,他可以从解决问题的每一步的所有可能选项里系统的选择一个可行方案。所以回溯法适用于有多个步骤组成的问题。题目一: 矩阵中的路径:判断一个矩阵中是否包含一条某字符串中所有字符的路径。路径可以从矩阵的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了某一格,则不能再进入该格子。分析: ...原创 2019-05-22 08:55:37 · 176 阅读 · 0 评论 -
字符串匹配问题---KMP & BF
BF算法实现:复杂度O(m*n)//在str的pos下标开始,判断是否包含sub字符串,包含则返回第一次匹配成功的开始下标int BF(const char *str, const char *sub, int pos) { if (str == NULL || sub == NULL) return -1; int lenstr = strlen(str); if (p...原创 2019-05-22 20:50:01 · 263 阅读 · 0 评论 -
打印从1到最大的n为数
问题举例: 当n为3时,则打印 1~999。代码实现:void PrintToMaxOfNDigits_1(int n){ int number = 1; int i = 0; while (i++ < n) //假如n = 3,则number = 1000 number *= 10; for (int i = 1; i < number; i...原创 2019-05-23 12:52:05 · 261 阅读 · 0 评论 -
O(1)删除链表节点 & 删除链表中的重复节点
O(1)删除链表节点:代码实现:void DeleteNode(ListNode **plist, ListNode *pToBeDelete){ if (plist == NULL || pToBeDelete == NULL) return; if (pToBeDelete->next != NULL) //要删除的点不是尾节点 { ListNode *pNe...原创 2019-05-23 19:10:55 · 230 阅读 · 0 评论 -
反转链表 & 找链表的入环点 & 找链表的倒数第k个节点 & 使得数组中奇数位于偶数之前
反转链表: 1. 用头插来实现 2. 用栈来实现(递归) 3. 三个指针,一个表示本节点,一个表示前驱,一个表示后继找链表的入环点: 第一步确认是否有环: 方法:快慢指针: 一个走得快,一个走的慢,当慢的能追上快的就是有环 ...原创 2019-05-23 23:05:55 · 217 阅读 · 0 评论 -
树的子结构
问题说明: 输入两颗二叉树A和B,判断 B是不是 A的子结构,即 A中的一部分子树和 B是一样的:分析: 1. 先找到A 中和 B的跟节点相等的点 2. 如果找到了再判断是不是错误的想法: 用层次遍历的结果进行匹配,错误原因如下图:结合分析的代码实现:bool DoesTree1HaveTre...原创 2019-05-23 23:17:14 · 152 阅读 · 0 评论 -
递归--斐波那契/青蛙跳台阶/矩阵填充
斐波那契: 递归实现:long long Fibonacci(unsigned int n){ if (n <= 0) return 0; if (n == 1) return 1; return Fibonacci(n - 1) + Fibonacci(n - 2);} 循环实现:long long Fibonacci(unsigned ...原创 2019-05-21 17:11:32 · 304 阅读 · 0 评论 -
数值的整数次方 & 3种错误处理的方法
问题描述: 实现Power(double base,int exponent),求base的exponent次方,不考虑大数问题。分析: 指数小于0时,得到正数部分,最后结果要取倒数;而指数为0且底数为0时就错误,因为0不能取倒数代码实现:bool g_InvalidInput = false;bool is_0(double base){...原创 2019-05-25 08:40:32 · 187 阅读 · 0 评论 -
数组中重复的数字
题目一: 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出的重复的数字为2或3。分析: 1. 用排序,但是最快的排序也要nlog(n),可不可以 O(1) ...原创 2019-05-20 17:49:26 · 167 阅读 · 0 评论 -
字符串替换空格
问题描述: 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。分析: 1. 从前向后替换,需要挪动数据,复杂度为O(n^2) 2. 从后向前替换,可不必挪动数据,复杂度为O(n)代码实现://length为数组最大的容量 void repla...原创 2019-05-20 19:55:08 · 156 阅读 · 0 评论 -
中序遍历和先序遍历组合重建二叉树
问题描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。分析: 使用递归来实现这个问题代码实现:typedef struct TreeNode { int va...原创 2019-05-20 21:15:44 · 202 阅读 · 0 评论 -
二叉树的递归和非递归遍历
节点定义如下:typedef struct TreeNode { int val; TreeNode *left; TreeNode *right;}TreeNode;先序递归遍历:void PreOrder(TreeNode *p){ if (p != NULL) { cout << p->val << " ";...原创 2019-05-20 21:37:45 · 174 阅读 · 0 评论 -
字符串转数组---atoi
字符串转数字: 注意:1.越界 2.正负 3.字符串为NULL:str == NULL 4.字符串为空串: str == "" 5.字符串为0: str == "0" 6.字符串只有符号位: str == "+" 或者 str == "-...原创 2019-05-24 13:47:07 · 686 阅读 · 0 评论 -
二叉树中任意两节点的最近父祖先
分析:1.二叉树是 二叉搜索树(左节点小于父节点,右节点大于父节点) 思路:从根节点开始,如果当前节点比两个节点都大,则在左子树;如比当前节点都小,则在右子树 以此类推,直到找到一个节点的大小介于两节点之间,则该节点就是最近的公共父节点2.非二叉搜索树,但有指向父节点的指针域 思路:分别从两个节点开始得到其...原创 2019-05-24 13:49:49 · 441 阅读 · 0 评论 -
两个栈实现一个队列&两个队实现一个栈
题目一: 用两个栈来实现一个队列,完成队列的push和pop操作。 队列中的元素为int类型。分析: 入栈都进入stack1, 出栈都是在stack2;当stack2无数据的时候将 stack1全部数据放入stack2中代码实现:class Queue{public: void push(int node) { stack1...原创 2019-05-20 23:09:14 · 440 阅读 · 0 评论 -
正则表达式匹配
问题说明: 实现一个函数用来匹配包含'.' 和 '*' 的正则表达式; 在模式中,'.'表示任意字符, '*'表示其前面的字符可以当做任意次(包括0次,1次,n多次) ; 例如字符串"aaa"和模式"a.a" / "ab*ac*a"匹配,和模式"a.aa" / "ab*a"不匹配。分析:(1) 当模式中的第二个(相对的第二) 字符不是'*',则开始匹配剩余的字符,如...原创 2019-05-24 18:59:46 · 384 阅读 · 0 评论 -
位运算&进制转换
进制转换:(1) 十进制与二进制之间的转换 十进制转换为二进制,分为整数部分和小数部分 整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。下面举例:例:将十进制的168转换为二进制得出结...原创 2019-05-21 13:03:58 · 2457 阅读 · 0 评论 -
表示数字的字符串
问题说明: 实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如:“+100”,“5e2”,“-123”,“-1e-16”,“2.345E9”都可表示数字,"12e","1a3.14","1.2.3","12e+5.4" 都不能表示数字。分析: 可将表示数字的字符串抽象为:A [[.B]] [E|eC] 或者 .[B][E|eC]其...原创 2019-05-24 22:59:13 · 3547 阅读 · 0 评论