剑指Offer
liuxinyu9795
这个作者很懒,什么都没留下…
展开
-
剑指Offer 066机器人的运动范围
066机器人的运动范围题目:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?方法:回溯法思路:还...原创 2019-07-21 14:43:48 · 179 阅读 · 0 评论 -
剑指Offer 052正则表达式匹配
052正则表达式匹配题目:请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"aba"均不匹配方法:递归法思路:1.如果字符串的第一个跟模式的第一个相同,模式第二个为时,...原创 2019-07-20 00:00:52 · 109 阅读 · 0 评论 -
剑指Offer 036两个链表的第一个公共结点
036两个链表的第一个公共结点题目:输入两个链表,找出它们的第一个公共结点。其实我一开始并不懂什么是公共结点,上网一搜才知道,下面就是两个链表有公共结点公共结点就是两个链表的结点的地址值相同,不是结点所含的值相同方法一:HashSet储存法思路:可以新建一个HashSet的set,然后先将A链表的所有结点存进去,然后在用B的每一个结点来判断,当发现set中存在这个结点,就返回这个结点...原创 2019-07-17 17:57:07 · 103 阅读 · 0 评论 -
剑指Offer 051构建乘积数组
051构建乘积数组题目:给定一个数组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]。不能使用除法。方法:巧解法思路:用的是剑指Offer上的思路分别对下三角和上三角进行求解,下三角非常简单,就是Bn=Bn-1*An-1,从1到n-1递推下去上三角则需要从n-2开始倒退回0,相同的原...原创 2019-07-19 21:01:40 · 209 阅读 · 0 评论 -
剑指Offer 035数组中的逆序对
035数组中的逆序对题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007方法一:暴力法思路:两个for循环判断,可惜时间超时,是n^2的时间复杂度方法二:归并排序法思路:先将数组中的元素分成一个一个的,然后两两合并,在合并的时候进行...原创 2019-07-17 16:52:37 · 136 阅读 · 0 评论 -
剑指Offer 050数组中重复的数字
050数组中重复的数字题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。方法一:boolean数组标记法思路:新建一个于原数组长度相同的boolean数组,遍历后会标记为...原创 2019-07-19 19:25:58 · 134 阅读 · 0 评论 -
剑指Offer 049把字符串转换成整数&&2020字节跳动一面笔试题
049把字符串转换成整数题目:将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0,如果溢出也返回0方法:转换法思路:先要判断特殊情况,第一位是否是+,-号,如果是需要记下来,没有就当是正数;然后在循环中每一步都要判断是否溢出代码:...原创 2019-07-19 18:51:02 · 185 阅读 · 0 评论 -
剑指Offer 048不用加减乘除做加法
049不用加减乘除做加法题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。方法:二进制位运算思路:转换成二进制,先对每位进行相加,二进制每位相加就相当于各位做异或操作,判断是否需要进位,各位做与操作后再向左移一位得到代码:public int Add(int num1,int num2) { while(num2!=0){ ...原创 2019-07-19 16:18:58 · 90 阅读 · 0 评论 -
剑指Offer 047求1+2+3+...+n
048求1+2+3+…+n题目:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。方法:递归法思路:就一层一层的递归下去即可,写好递归终止条件即可代码:public int Sum_Solution(int n) { int sum=n; if(n>0){ ...原创 2019-07-19 14:59:30 · 96 阅读 · 0 评论 -
剑指Offer 046圆圈中最后剩下的数
046圆圈中最后剩下的数题目:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…...原创 2019-07-19 14:39:25 · 112 阅读 · 0 评论 -
剑指Offer 045扑克牌顺子
045扑克牌顺子题目:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为...原创 2019-07-19 13:52:56 · 174 阅读 · 0 评论 -
剑指Offer 034第一个只出现一次的字符
034第一个只出现一次的字符题目:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).方法:LinkdHashMap存储法思路:遍历字符串存在LinkdHashMap中,存完之后再遍历字符串判断每个字符的k对应的value值有没有为1的,为1就输出这个位置,符合题目说出的第一个位置...原创 2019-07-16 23:56:46 · 117 阅读 · 0 评论 -
剑指Offer 033丑数
033丑数题目:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。ps:丑数=x2+y3+z*5; 可以为1,2,3,4,5,6,8,9,10…等方法:三指针法思路:创建一个列表,先把1放进去,然后让2,3,5的指针都指向1,然后分别让1乘这三个数,找其中的...原创 2019-07-16 22:45:42 · 114 阅读 · 0 评论 -
剑指Offer 044翻转单词顺序列
044翻转单词顺序列题目:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?方法...原创 2019-07-19 00:19:10 · 112 阅读 · 0 评论 -
剑指Offer 043左旋转字符串
043左旋转字符串题目:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!方法:API法思路:对k%s.length,然后在这个地方分割字符串加在字符串...原创 2019-07-18 23:45:55 · 136 阅读 · 0 评论 -
剑指Offer 053表示数值的字符串
053表示数值的字符串题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。方法:逐步筛选法思路:就需要对正负号,小数点,e的位置进行判断,然后判断除了0-9,正负号,小数点,e其他的都返回fa...原创 2019-07-20 00:40:36 · 209 阅读 · 0 评论 -
剑指Offer 054字符流中第一个不重复的字符
054字符流中第一个不重复的字符题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出:如果当前字符流没有存在出现一次的字符,返回#字符,有就输出当前字符方法:用Arraylist队列来记输入流,用HashMap来记字符出...原创 2019-07-20 01:21:52 · 136 阅读 · 0 评论 -
剑指Offer 065矩阵中的路径
065矩阵中的路径题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abc...原创 2019-07-21 14:02:50 · 173 阅读 · 0 评论 -
剑指Offer 064滑动窗口的最大值
064滑动窗口的最大值题目:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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,...原创 2019-07-21 13:23:38 · 126 阅读 · 0 评论 -
剑指Offer 063数据流中的中位数
063数据流中的中位数题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。解释:两个函数,一个插入函数,一个得出中位数函数(排序之后的中位数)方法:大小根堆...原创 2019-07-20 23:32:37 · 166 阅读 · 0 评论 -
剑指Offer 062二叉搜索树的第k个节点
062二叉搜索树的第k个节点题目:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。方法:中序遍历+递归思路:要找第k小的节点,因为是二叉搜索树,所以中序遍历之后的结果就是从小到大的顺序,用一个变量来记数代码:int index =0;//计数器 TreeNode KthNode(TreeNod...原创 2019-07-20 23:05:01 · 98 阅读 · 0 评论 -
剑指Offer 061序列化二叉树
061序列化二叉树题目:请实现两个函数,分别用来序列化和反序列化二叉树解释:序列化:给你一个root节点,前序遍历打印成一个字符串,每个节点之间加一个’,’,如果为空就’#'填充,返回字符串反序列化:给你字符串,让你还原成二叉树,返回头节点方法:前序遍历+递归法思路:前序遍历就是根左右,然后用递归做下去,反序列化也是递归代码: int index=-1;//反序列化中计数的一个变...原创 2019-07-20 22:05:55 · 103 阅读 · 0 评论 -
剑指Offer 060把二叉树打印成多行
060把二叉树打印成多行题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。方法:队列计数法思路:新建一个队列,每次把取出的节点的左右孩子节点放进去,然后用一个变量来记下每层节点的数量代码:ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) { ArrayList<Arr...原创 2019-07-20 21:34:51 · 162 阅读 · 0 评论 -
剑指Offer 059按之字形顺序打印二叉树
059按之字形顺序打印二叉树题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。方法:双栈分别存奇偶层思路:新建两个栈分别来存放奇偶层的二叉树节点,用一个变量%2为0还是1控制奇偶,奇数每个节点出来就遍历,然后把左右子树存到偶数栈里,遍历完后,把变量++,去遍历偶数栈,代码:public ...原创 2019-07-20 18:51:12 · 125 阅读 · 0 评论 -
剑指Offer 039平衡二叉树
039平衡二叉树题目:输入一棵二叉树,判断该二叉树是否是平衡二叉树。平衡二叉树的定义是左右子树的长度不大于1方法:递归法思路:对二叉树从底部进行判断,一层一层算上来,遍历到一个节点,其左右子树已经遍历 依次自底向上判断,每个节点只需要遍历一次代码:boolean isBalanced = true; public boolean IsBalanced_Solution(Tr...原创 2019-07-18 01:30:36 · 107 阅读 · 0 评论 -
剑指Offer 058对称的二叉树
058对称的二叉树请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。方法一:递归法思路:写一个递归函数,递归推出的条件就是left和right是否同时为true,然后在返回那里继续判断left,right的值是否相等,和子树是否相等代码:boolean isSymmetrical(TreeNode pRoot){ ...原创 2019-07-20 17:06:58 · 115 阅读 · 0 评论 -
剑指Offer 038二叉树的深度
038二叉树的深度题目:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。方法一:递归版本思路:在返回的时候对左右子树的最大值+1代码:public int TreeDepth(TreeNode root) { if(root==null) return 0; int left =Tr...原创 2019-07-17 22:03:08 · 133 阅读 · 0 评论 -
剑指Offer 057二叉树的下一个结点
057二叉树的下一个结点题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。方法:定义法思路:中序遍历是先遍历左子树->根节点->右子树于是根据结点的不同情况,要分类讨论:1.如果二叉树为空,直接返回空2.如果是二叉树的根节点,有右子树的话,就找右子树的最左节点3.不是根节点,如果...原创 2019-07-20 15:29:07 · 125 阅读 · 0 评论 -
剑指Offer 056删除链表中重复的节点
056删除链表中重复的节点题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5方法:双指针法思路:创建两个指针cur,last分别指向头和头相邻后继结点,然后判断last是否跟后面的结点相同,不相同就移动两个指针,相同...原创 2019-07-20 14:36:22 · 139 阅读 · 0 评论 -
剑指Offer 037数字在排序数组中出现的次数
037数字在排序数组中出现的次数题目:统计一个数字在排序数组中出现的次数。ps:这道题一看到有序数组,找某个数就想着二分查找方法:二分查找变形版思路:写两个基于二分查找的函数,求出第一个这个值和最后一个这个值代码:public int GetNumberOfK(int [] array , int k) { int length = array.length; ...原创 2019-07-17 20:32:50 · 149 阅读 · 0 评论 -
剑指Offer 055链表种环的入口结点
055链表种环的入口结点题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。方法:快慢指针法思路:设两个指针,分别为快慢指针,快指针每次进两格,慢指针每次进一格,如果有环存在,就会相交,然后让一个指针指向head头节点,两个指针每次走一格,直到两者相遇,就是环的入口结点代码:public ListNode EntryNodeOfLoop(ListNode ...原创 2019-07-20 02:11:49 · 137 阅读 · 0 评论 -
剑指Offer 032把数组排成最小的数
032把数组排成最小的数题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。方法:比较法思路:本题的意思是让各种排序的数字最小,说明我们要进行比较,把小的排在前面,但因为位数不同没法比较,所以需要自定义排序,让两个数字变成字符串来进行判断,把小的放在前面,最后遍...原创 2019-07-16 18:02:26 · 114 阅读 · 0 评论 -
剑指Offer 031整数中1出现的次数
031整数中1出现的次数求出从1到n的所有数中,1出现的次数(11算两次,111算三次)方法一:暴力字符串求解方法:把它所有数用StringBuffer记下来,然后转成String字符串然后遍历进行判断代码:public int NumberOf1Between1AndN_Solution(int n) { if(n<=0) return 0; St...原创 2019-07-16 16:32:06 · 118 阅读 · 0 评论 -
剑指Offer 030连续子数组的最大和
030连续子数组的最大和题目:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组...原创 2019-07-16 14:19:46 · 144 阅读 · 0 评论 -
剑指Offer 018二叉树的镜像
018二叉树的镜像题目:操作给定的二叉树,将其变换为源二叉树的镜像。方法:递归法思路:创建一个新结点,指向左节点,然后对左右节点进行交换,然后再递归调用继续交换左右节点的子节点代码:public void Mirror(TreeNode root) { if(root==null) return; TreeNode tmp = root.left; ...原创 2019-06-20 19:22:21 · 220 阅读 · 0 评论 -
剑指Offer 004重建二叉树
004重建二叉树题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。方法:递归法思路:因为前序遍历是根左右的顺序,中序遍历是左根右的顺序,前序遍历的第一个值一定是跟,只需要将左右两边分开,然后继续递归下...原创 2019-06-16 14:43:17 · 104 阅读 · 0 评论 -
剑指Offer 003从尾到头打印链表
003从尾到头打印链表题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。方法一:利用栈来反转思路:因为栈的结构特性是先入后出的结构,我们可以先把链表的值存到栈中,然后输出出来就是从尾到头的代码:public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { St...原创 2019-06-15 16:52:00 · 135 阅读 · 0 评论 -
剑指Offer 002替换空格
002替换空格题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。方法:暴力法思路:将StringBuffer先转换成String字符串再转换成char数组,然后创建一个StringBuffer字符串,对char数组进行遍历,如果为空格就添加%20,不是就添加本身,返回即可代码...原创 2019-06-15 16:34:46 · 129 阅读 · 0 评论 -
剑指Offer 001二维数组中的查找
001二维数组中的查找题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。方法:观察规律法思路:一行中从左到右是依次增加的,一列中从上到下是依次增加的,于是我们可以选定最右上角的地方来进行判断,如果被查找的数字小于右上角的数字,就将这一列除去,...原创 2019-06-15 16:29:13 · 104 阅读 · 0 评论 -
剑指Offer 017树的子结构
017树的子结构题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)方法:递归思路:先对头结点进行判断,如果不满足分别在A的左子树和右子树中继续判断头结点是否相同,如果头结点相同,再进行判断,判断左右子树是否都相同即可代码:public boolean HasSubtree(TreeNode root1,TreeNode root2) { ...原创 2019-06-20 00:40:09 · 119 阅读 · 0 评论