
剑指offer
欢偷偷
这个作者很懒,什么都没留下…
展开
-
剑指offer——打印二叉树 c++版和java版
题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:队列实现,先进跟节点,然后出一个跟,就把左右孩子放进队列,直到队为空。这道题思路清晰之后很好写买就是考察一下对队列的熟悉程度。1.c++版本#include<deque>/*struct TreeNode { int val; struct TreeNode *left; struct Tre...原创 2018-05-08 21:47:40 · 123 阅读 · 0 评论 -
剑指offer——66/66机器人的运动范围
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子? 思路:采用回溯法进行移动的时候,(i,j)的值是从(i...原创 2018-07-11 11:07:59 · 142 阅读 · 0 评论 -
剑指offer——65/66矩阵中的路径
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个...原创 2018-07-11 16:32:17 · 117 阅读 · 0 评论 -
剑指offer——64/65滑动窗口的最大值
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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],2,5,1}, ...原创 2018-07-11 19:44:05 · 159 阅读 · 0 评论 -
剑指offer——扑克牌顺子
LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面...原创 2018-07-18 21:54:31 · 156 阅读 · 0 评论 -
剑指offer——把字符串转换为整数
将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。思路:除掉空格,判断是否是合法字符,合法之后判断是否为正负值,然后计算。class Solution {public: int StrToInt(string str)...原创 2018-07-18 22:00:16 · 174 阅读 · 0 评论 -
剑指offer——62/66二叉搜索树的第k个结点
给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。思路:中序遍历/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : ...原创 2018-07-12 20:38:00 · 131 阅读 · 0 评论 -
剑指offer——63/66数据流中的中位数
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。思路:数据分为两部分,大顶堆得到最大的数放在min中,小顶堆得到最小的数放在max中。class Solution {public: vector<int>min; vector<...原创 2018-07-12 20:52:12 · 117 阅读 · 0 评论 -
剑指offer——60/66把二叉树打印成多行
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:层序遍历,使用队列class Solution {public: vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int> >res; vect...原创 2018-07-13 14:16:11 · 166 阅读 · 0 评论 -
剑指offer——59/66按之字形顺序打印二叉树
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:层次遍历,但是偶数层的需要反着添加!class Solution {public: void reverse(vector<int>&vec) { for(int i=0;i<vec.siz...原创 2018-07-14 08:39:30 · 144 阅读 · 0 评论 -
剑指offer——60/66对称的二叉树
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:判断一棵树是否是对称的,需要判断子树也是对称的,所以需要判断左子树的左子树和右子树的右子树相等,左子树的右子树和右子树的左子树相等。class Solution {public: bool isSymmetrical(TreeNode* pRoot) { ...原创 2018-07-15 10:41:31 · 119 阅读 · 0 评论 -
剑指offer——50/66
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路:利用递归实现。1.需利用逻辑与的短路特性实现递归终止。2.当n==0时,(n>0)&&((sum+=Sum_Solution(n-1))>0)只执行前面的判断,为false,然后直接返回0;3.当n>0...原创 2018-07-17 11:29:14 · 137 阅读 · 0 评论 -
剑指offer——51/66不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用+-*/四则运算符号!思路:利用与运算和异或运算得到进位和求和。class Solution {public: int Add(int num1, int num2) { int sum,carry; do { sum=num1^num2; ...原创 2018-07-17 11:10:07 · 128 阅读 · 0 评论 -
剑指offer———二叉树中和为某一值的路径 c++和java版本实现
题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路:有可能存在好几条路径都符合条件,如果找到叶子节点的同时,路径和也为给定值,那么添加这条路径,否则,弹出最后一个元素,重新添加右节点,继续判断。1.c++版本/*struct TreeNode { int val; struct TreeNod...原创 2018-05-09 10:26:24 · 179 阅读 · 0 评论 -
剑指offer————二维数组中的查找c++实现
问题:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:从右上角开始找,如果比目标值大,往下走,如果比目标值小,往左走。class Solution {public: bool Find(int target, vector<vector<int> ...原创 2018-04-26 19:46:40 · 286 阅读 · 0 评论 -
剑指offer————替换空格c++实现
问题:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:从前往后移动,移动的次数太多,从后往前移动,移动的次数刚好!class Solution {public: void replaceSpace(char *str,int length) { if(str==NU...原创 2018-04-26 20:53:58 · 660 阅读 · 0 评论 -
剑指offer二叉树的重建——c++和java对比实现
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:前序遍历第一个节点就是根节点,根节点在中序遍历中将数分为两组,左边是左子树,右边是右子树,分别将左子树和右子树分别进行寻找根节点,递归实现。1.java...原创 2018-05-07 08:53:48 · 177 阅读 · 0 评论 -
剑指offer——56/66链表中环的入口结点
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路:双指针方法,fast每次走两布,slow每次走一步,两个指针相遇的时候,假设非环路径为x,环长度为y,相遇时slow走的环的距离是A,即:fast=x+n*y+A;slow=x+A;因为fast比slow多一倍距离,因此此时让slow回到起点,slow和fast同时一步走,相遇即为环的入口起点。class Soluti...原创 2018-07-16 11:10:56 · 123 阅读 · 0 评论 -
剑指offer——55/66字符流中第一个不重复的字符
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符。class Solution{public: //Insert one char from stringst...原创 2018-07-16 13:17:53 · 186 阅读 · 0 评论 -
剑指offer——54/66表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。思路;把所有不合法的列举出来,剩下的就是合法的了!cl原创 2018-07-16 15:07:12 · 138 阅读 · 0 评论 -
剑指offer——53/66正则表达式匹配
请实现一个函数用来匹配包括‘.’和‘*’的正则表达式,模式中的字符‘.’表示任意一个字符,而‘*’表示它前面的字符可以出现任意多次(包含0次),在本题中,匹配是指字符串的所有字符匹配整个模式,例如字符串“aaa”与模式“a.a”和“ab*ac*a”匹配,但是与“aa.a”和“ab*a”均不匹配。class Solution {public: bool match(char* str...原创 2018-07-16 16:08:30 · 139 阅读 · 0 评论 -
剑指offer——53/66构建乘积数组
给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。思路: 很明显的,分别计算下三角和上三角的乘积!class Solution {public: vector<int> multiply(const ve...原创 2018-07-17 10:59:25 · 120 阅读 · 0 评论 -
剑指offer——52/66数组中重复的数字
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路:用一个哈希表先将所有出现的数字的次数保存起来,再遍历一次,得到重复的数字。class Solution {publi...原创 2018-07-17 11:01:29 · 136 阅读 · 0 评论 -
剑指offer——58/66二叉树的下一个结点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:1.二叉树为空,则返回空。2.结点的右孩子存在,从右孩子出发,找到右孩子的最左孩子结点。3.如果不是根结点,判断该结点是其父结点的左孩子,那么返回父结点,重复之前的判断,返回!class Solution {public: TreeLinkNode*...原创 2018-07-15 11:17:17 · 124 阅读 · 0 评论