
剑指offer与编程题
lMonster81
淡泊以明志,宁静以致远
展开
-
表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。 class Solution {pub转载 2018-10-08 23:17:31 · 191 阅读 · 0 评论 -
数值的整数次方(快速幂)
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 注意题目也可能出更大的数,最好使用longlong来存,有时候也会将结果mod一个值 class Solution {public: double Power(double base, int exponent) { doubl...原创 2018-09-28 13:04:50 · 281 阅读 · 0 评论 -
已知前序或后续遍历和中序遍历重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。struct TreeNode { int val; TreeNode *left; TreeNode *...原创 2018-09-28 13:01:17 · 354 阅读 · 0 评论 -
无判断取两者最大值MAX
题目描述请编写一个方法,找出两个数字中最大的那个。条件是不得使用if-else等比较和判断运算符。给定两个int a和b,请返回较大的一个数。若两数相同则返回任意一个。测试样例:1,2返回:2 算出最大的数的两倍,再除以2class Max {public: int getMax(int a, int b) { return((a +...原创 2018-09-27 23:02:51 · 602 阅读 · 0 评论 -
无缓存交换
题目描述请编写一个函数,函数内不使用任何临时变量,直接交换两个数的值。给定一个int数组AB,其第零个元素和第一个元素为待交换的值,请返回交换后的数组。测试样例:[1,2]返回:[2,1]方法一:class Exchange {public: vector<int> exchangeAB(vector<int> AB) { ...原创 2018-09-27 22:55:37 · 198 阅读 · 0 评论 -
像素翻转
题目描述有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于500,图像元素小于等于256。测试样例:[[1,2,3],[4,5,6],[7,8,9]],3返回:[[7,4,1],[8,5,2],[9,6...原创 2018-09-27 22:46:58 · 159 阅读 · 0 评论 -
字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。 解:使用DFS的思路,利用递归组成所有可能的字符串,因为可能有重复字符,所以采用set来存储,也可以用其他办法。...原创 2018-10-04 23:15:28 · 161 阅读 · 0 评论 -
二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 解题思路:1.将左子树构造成双链表,并返回链表头节点。2.定位至左子树双链表最后一个节点。3.如果左子树链表不为空的话,将当前root追加到左子树链表。4.将右子树构造成双链表,并返回链表头节点。5.如果右子树链表不为空的话,将该链表追加到...原创 2018-10-04 22:32:40 · 224 阅读 · 1 评论 -
搜索:机器人的运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子? 解:BFS cl...原创 2018-09-27 15:22:29 · 191 阅读 · 0 评论 -
搜索:矩阵中的路径
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字...原创 2018-09-27 15:21:03 · 406 阅读 · 0 评论 -
复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) (图片来自牛客) *解题思路:1、遍历链表,复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面;2、重新遍历链表,...原创 2018-10-04 20:57:37 · 121 阅读 · 0 评论 -
不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 解:十进制的加法: 5+7=12相加各位的值,不算进位,得到2。计算进位值,得到10重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12(不算进位的结果加上 进位)。 同样我们可以用上述方法计算二进制值相加: 5-101,7-111相加各位的值,不算进...原创 2018-09-28 23:02:49 · 129 阅读 · 0 评论 -
数字发音
题目描述有一个非负整数,请编写一个算法,打印该整数的英文描述。给定一个int x,请返回一个string,为该整数的英文描述。测试样例:1234返回:"One Thousand,Two Hundred Thirty Four" #include<bits/stdc++.h>using namespace std;string X[10] = {" ",...原创 2018-09-28 23:26:37 · 304 阅读 · 0 评论 -
访问单个节点的删除
题目描述实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点。给定待删除的节点,请执行删除操作,若该节点为尾节点,返回false,否则返回true 解:把当前把下一个节点的值拷贝到当前节点,然后删除下一个节点。 /*struct ListNode { int val; struct ListNode *next; ListNod...原创 2018-09-28 23:34:32 · 203 阅读 · 0 评论 -
正则表达式匹配
题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配 首先,考虑特殊情况: 1>两个字符串都为空,返回t..转载 2018-10-08 23:16:18 · 180 阅读 · 0 评论 -
把二叉树打印成多行
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。 二叉树的层次遍历 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), r...原创 2018-10-08 23:14:30 · 136 阅读 · 0 评论 -
二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 理解了中序遍历,然后推导各种情况即可。 struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode *righ...原创 2018-10-08 23:12:55 · 117 阅读 · 0 评论 -
删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 重新设置一个头节点。只能修改前一个节点指针的next,不能修改当前节点的指针。 struct ListNode { int va...原创 2018-10-08 23:11:31 · 115 阅读 · 0 评论 -
链表中环的入口结点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 解法一:设置一个指针类型的map映射struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};class Solu...原创 2018-10-08 23:10:42 · 107 阅读 · 0 评论 -
平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。 递归,其左右子树也都为平衡二叉树 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};cl...原创 2018-10-08 23:04:56 · 145 阅读 · 0 评论 -
二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 关于二叉树的题目,大多都有递归有关。 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(...原创 2018-10-08 23:01:24 · 144 阅读 · 0 评论 -
两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。 解:如果有公共节点,那么后面的节点数和节点都完全一样。如果没有公共节点,那么公共节点就是NULL。所以链表长度较长的那一个,表头指针先走两个链表长度差值的步数,然后两个指针再共同走。如果有公共节点,那么该方法一定成立。 struct ListNode { int val; struct ListNode *ne...原创 2018-10-08 22:58:13 · 123 阅读 · 0 评论 -
牛客—采花生
题目:链接:https://www.nowcoder.com/questionTerminal/83740e9b96074dd89edaf9bfad43cac3来源:牛客网鲁宾逊先生有一只宠物猴,名叫多多。这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”。鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。在告示牌背后,路边真...原创 2018-08-01 03:38:13 · 237 阅读 · 0 评论 -
链表分割
题目描述编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。 #include<bits/stdc++.h>using namespace std;struct ListNode { int ...原创 2018-09-28 23:37:33 · 166 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 解:将二叉树看成图,使用DFS进行遍历,遍历时进行数据保存和回溯。 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *righ...原创 2018-10-04 01:31:54 · 156 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 解:根据后序遍历的特征,和二叉搜索树的特性(左边的任何节点比根节点小,右边的任何节点比根节点大),只要找到根节点,然后找出左子数和右子树的遍历顺序,左子数和右子树也是二叉搜索树,再进行判断和递归。就可以得出解。 class S...原创 2018-10-04 01:29:16 · 97 阅读 · 0 评论 -
树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 注意:不一定子结构B在A中一定是包含叶子节点的,有可能也是中间那部分,所以刚开始的判断条件出错。 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(i...原创 2018-10-04 01:07:34 · 155 阅读 · 0 评论 -
合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 注意考虑输入为NULL的情况class Solution {public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { ListNode *last = NULL; ...原创 2018-09-25 13:21:50 · 107 阅读 · 0 评论 -
矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?设f(n) = 2 * n 的大矩形中的放法总数当n >= 2时,最后一种放法可以为竖着放,可以为横着放。两种放法都只有一种可能。那么f(n) = f(n - 1) + f(n - 2)。 class Solution ...原创 2018-09-25 13:16:41 · 133 阅读 · 0 评论 -
青蛙跳台阶和变态跳台阶
跳台阶题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解:设f(n)为跳上n级台阶的总跳法数假设青蛙跳上n级台阶的最后一跳只跳了一级,那么f(n) = f(n - 1);假设青蛙跳上n级台阶的最后一跳只跳了二级,那么f(n) = f(n - 2);那么跳上n级台阶的总跳法数应该为:f(n)...原创 2018-09-25 13:09:23 · 169 阅读 · 0 评论 -
两个栈实现一个队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 解:用两个栈来存储,一个栈存储进队的元素一个栈存储需要出队的元素class Solution{public: void push(int node) { stack1.push(node); } int pop() { ...原创 2018-09-25 12:57:35 · 116 阅读 · 0 评论 -
二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 解矩阵是有序的,从左下角来看,向上数字递减,向右数字递增,因此从左下角开始查找,当要查找数字比左下角数字大时。右移要查找数字比左下角数字小时,上移 从左上角或右下角来...原创 2018-09-25 12:54:34 · 136 阅读 · 0 评论 -
牛客 二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 一: 该解法如果输入时负数会陷入死循环,因为负数右移时,在最高位补得是1, 而本题最终目的是求1的个数,那么会有无数个1了,然后死循环。class Solution {public: int NumberOf1(int n) { int ans = 0; ...原创 2018-09-13 21:36:01 · 209 阅读 · 0 评论 -
牛客算法题 翻转字串
题目描述假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。给定两个字符串s1,s2,请返回bool值代表s2是否由s1旋转而成。字符串中字符为英文字母和空格,区分大小写,字符串长度小于等于1000。测试样例:"Hello world","wor...原创 2018-09-10 14:21:16 · 259 阅读 · 0 评论 -
牛客算法题 机器人走方格II 动态规划
题目描述有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。注意这次的网格中有些障碍点是不能走的。给定一个int[][] map(C++ 中为vector >),表示网格图,若map[i][j]为1则说明该点不是障碍点,否则则为障碍。另外给定int x,int y,表示网格的大小。请返回机器人从(0,0)走到(x ...原创 2018-09-07 23:14:18 · 1603 阅读 · 0 评论 -
牛客算法题 合法括号序列判断
题目描述对于一个字符串,请设计一个算法,判断其是否为一个合法的括号串。给定一个字符串A和它的长度n,请返回一个bool值代表它是否为一个合法的括号串。测试样例:"(()())",6返回:true测试样例:"()a()()",7返回:false测试样例:"()(()()",7返回:false 题解:遇到左括号时,变量值+1,遇到右括...原创 2018-09-07 22:57:20 · 1027 阅读 · 0 评论 -
包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 应用一个辅助栈。压入:如果A栈的压入比B栈顶部元素大,B栈不压。小于等于:AB栈同时压入。出栈:如果AB栈顶元素不等,A出,B不出。 class Solution {public: stack<int> s1; stack<int...原创 2018-09-25 13:27:11 · 216 阅读 · 0 评论 -
从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。 相当于BFSclass Solution {public: vector<int> PrintFromTopToBottom(TreeNode* root) { vector<int> res; queue<TreeNode*> tree;...原创 2018-09-25 13:29:12 · 159 阅读 · 0 评论 -
和为S的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正数序...原创 2018-09-25 13:44:56 · 161 阅读 · 0 评论 -
栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 解:按照顺序压入辅助栈,如果栈顶与给出的出栈顺序的相同,则出栈一直到不相...原创 2018-10-04 00:00:00 · 114 阅读 · 0 评论