剑指 offer
qiguanfu~
湖南科技大学
展开
-
机器人的运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子? public class So...原创 2019-03-24 13:40:10 · 178 阅读 · 0 评论 -
链表中环的入口结点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。解题思路关于这道题,我是用HashSet方法add(),这个add()如果增加成功返回true,如果增加的数据已经存在了那么就返回。/* public class ListNode { int val; ListNode next = null; ListNode(int...原创 2019-03-22 15:11:00 · 132 阅读 · 0 评论 -
字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述如果当前字符流没有存在出现一次的字符,返回#字符。解题思路很直白的思路,没什么算法可言。直接撸代码import java.util.Map;...原创 2019-03-22 14:56:36 · 88 阅读 · 0 评论 -
平衡二叉树
题目描述输入一颗二叉树,判断该二叉树是否是平衡二叉树。解题思路先找出根节点的左节点的深度,然后找出右节点的的深度,比较两个节点的深度,等于或者超过2就直接返回,按照这个顺序,遍历这个树的每个节点,验证每个节点是否存在不平衡的情况的,若有一个节点以这个节点为根的子树不平衡,那么整颗树都不平衡。public class Solution { public boolean Is...原创 2019-03-18 22:16:49 · 90 阅读 · 0 评论 -
二叉树的深度(面试容易被问)
题目描述输入一颗二叉树,求该树的深度,从根节点到叶节点依此经过的节点(含根,叶节点)形成树的一条路径,最长路径的长度为树的深度。解题思路这道题是我第一次面试的时候上来就要手撕代码,很容易理解,递归就完事了。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode righ...原创 2019-03-18 21:56:33 · 189 阅读 · 0 评论 -
数字在排序数组中出现的次数
题目描述统计一个数字在排序数组中出现的次数。解题思路这道题我不是按照循环查找数字的,说下我的想法吧。我是通过递归找出这个数字的开头下标,通过二分找出这个数字的结尾下标,这么一来就可以快速找到有多少个这个数字了。时间复杂度为o(logn)。如果你是按照循环的话,最坏的情况下时间复杂度为o(n)。public class Solution { public int GetNu...原创 2019-03-18 21:47:35 · 162 阅读 · 0 评论 -
两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。解题思路两种方式:第一种就是用map,把链表head1全部放进map里面,遍历head2的链表,找到第一个存在map里的key,这就是第一个相交的点,如果没有就不相交。第二种方法就是不用map,遍历head1和head2得到他的长度和最后一个节点len, end,比较end1和end2的内存地址是否相等,如果不相等的话就是不相交,如果相等...原创 2019-03-18 21:06:53 · 93 阅读 · 0 评论 -
树的子结构
题目描述输入两颗二叉树A,B,判断B是不是A的子结构(我们约定空树不是任一一个树的子结构)解题思路见代码注解/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { ...原创 2019-03-13 20:14:46 · 112 阅读 · 0 评论 -
合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路递归解法,这道题没什么好说的,简单的递归/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; ...原创 2019-03-13 19:44:42 · 110 阅读 · 0 评论 -
反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。解题思路反转的话就是下一位指向前一位,把他们的指针反转回来就可以了。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public...原创 2019-03-13 19:26:49 · 95 阅读 · 0 评论 -
链表中倒数第K个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路这道题的思路很巧妙,毕竟链表不能直接算出链表长度,要怎么做才能快速算出这个答案呢?用两个指针,分别为up和down,up指针先走k-1步,接下来两个指针一起走,当up指针走到尽头了,那么down指针就是倒数k个节点,思路很巧妙,但是也很容易理解/*public class ListNode { int val;...原创 2019-03-13 19:11:12 · 109 阅读 · 0 评论 -
构建乘积数组
题目描述给定一个数组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里面的思想下三角用连乘可以很容求得,上三角,从下向上也是连乘。因此我们的思路就很清晰了,先算下三角中的连乘,即我们先算出B...原创 2019-03-22 11:28:32 · 95 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路这道题是不可能用时间复杂度为o(n),空间复杂度为o(1)完成的,所以要么就是以时间换空间,要么就是以空间换时间,下面会给出两种做法,一个是开两个数组分别存储奇数偶数,然后再合并到原来数组,另一种方法就是...原创 2019-03-13 17:31:20 · 99 阅读 · 0 评论 -
数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。解题思路第一次做这道题的时候我是用循环暴力出来,分别比较数字是否存在,这样做虽然能过,但思路不是很好,现在我换了一种思路来写这道题,很容易理解的,看代码。第一次做法//num1,num2分别为长度为1的数组。传出参数//将num1[0],num2[0]设置为返回结果pub...原创 2019-03-19 09:40:10 · 89 阅读 · 0 评论 -
和为S的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述输出所有和为S的连续正数序...原创 2019-03-19 10:06:27 · 92 阅读 · 0 评论 -
和为S的两个数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述对应每个测试案例,输出两个数,小的先输出解题思路这道题要你输出一个最小乘积的两个数字的和为Num,我们可以知道两个数相隔远的乘积,相隔近的乘积大,举个例子,10 = 1 + 9和10 = 5 + 5 这两个数谁的乘积比较小,当然是1...原创 2019-03-19 10:18:45 · 109 阅读 · 0 评论 -
矩阵中的路径
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字...原创 2019-03-24 13:12:14 · 131 阅读 · 0 评论 -
滑动窗口的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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,...原创 2019-03-23 15:12:21 · 122 阅读 · 0 评论 -
数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。解题思路先创建两个堆,一个堆是大根堆,另一个堆是小根堆,用一个变量来记录数据流的个数。注意的是,当...原创 2019-03-23 14:56:46 · 160 阅读 · 0 评论 -
二叉搜索树的第K个结点
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。解题思路二叉搜索数的中序遍历是递增的形式,所以找到第k小个数就是中序遍历的第K个元素。需要注意下代码注释的部分。/*public class TreeNode { int val = 0; TreeNode left = ...原创 2019-03-23 14:22:37 · 141 阅读 · 0 评论 -
序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树解题思路按照先序遍历的顺序进行序列化,按照先序遍历的顺序进行反序列化。/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) {...原创 2019-03-23 13:47:52 · 117 阅读 · 0 评论 -
把二叉树打印成多行
题目描述从上到下按层打印二叉树,同一层结点从左到右输出。每一层输出一行。解题思路用队列存储每个结点,用两个指针,一个指针表示移动的指针,另一个指针表示这一行的最后的结点,每次从队列拿出的指针如果是这一行的最后一个结点的话那么就把数据存到ArrayList<ArrayList<Integer>>,所以这么一来的话就可以达到层次遍历。import java.u...原创 2019-03-23 11:47:38 · 112 阅读 · 0 评论 -
按之字形顺序打印二叉树
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。解题思路按照之字形,从根节点开始,根节点为第一层,奇数层从左到右开始打印,偶数层从右到左开始打印,那么当你奇数层的时候需要把左子树先压栈然后再压右子树,这样根据栈的先进后出性质,那么偶数层就从右到左打印了,当你偶数层的时候把右子树先压栈...原创 2019-03-23 11:14:37 · 115 阅读 · 0 评论 -
对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。解题思路需要判断二叉树是否是对称,那就判断左子树的左子树和右子树的右子树是否相等,而且还要判断左子树的右子树和右子树的左子树是否相等,如果都相等的话就是一棵二叉树。/*public class TreeNode { int val = 0; Tr...原创 2019-03-23 10:45:26 · 157 阅读 · 0 评论 -
二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。解题思路先判断这个结点是否为空,不为空就走下一步,判断这个结点是否有右子树,如果有右子树的话找出右子树最左的结点,那么这样就是这个结点的下一个中序遍历的结点了,如果没有右子树,那么找到该节点的的父节点,判断该节点的父节点的左子树是否为这个结点,不...原创 2019-03-22 19:35:41 · 110 阅读 · 0 评论 -
删除链表中重复的节点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5解题思路1. 首先添加一个头节点,以方便碰到第一个,第二个节点就相同的情况2.设置 pre ,last 指针, pre指针指向当前确定不重复的那个节点,而l...原创 2019-03-22 18:50:33 · 122 阅读 · 0 评论 -
扑克牌顺子
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K...原创 2019-03-19 11:41:10 · 101 阅读 · 0 评论 -
翻转单词顺序列
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?解题思路这道题是...原创 2019-03-19 11:17:46 · 112 阅读 · 0 评论 -
左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!解题思路简单的利用Java的API,没什么好书的。public class Solu...原创 2019-03-19 10:46:54 · 82 阅读 · 0 评论 -
数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方解题思路对于这道题来说肯定是不可能用Math.pow(i, j),这样是肯定拿不到offer的,我们可以先从简单的方式做起,也就是第一种方法。循环求出最后的结果,这也是我第一次刷这道题的做法,第二种做法就是利用二进制的位数,例如(加入exponent = 10)1 ...原创 2019-03-13 17:07:24 · 89 阅读 · 0 评论 -
第一次只出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).解题思路这道题的思路还是比较直import java.util.Map;import java.util.HashMap;public class Solution { public int Fir...原创 2019-03-18 20:04:09 · 100 阅读 · 0 评论 -
数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。解题思路这个没什么好说,注意一点的是set.add(numbers[i]) 这个返回值是true or false...原创 2019-03-21 16:27:12 · 122 阅读 · 0 评论 -
替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思路这道题没什么好说的,对Java Api熟悉的人都应该做的出来,以下附上两种题解1)public class Solution { public String replaceSpace(String...原创 2019-03-11 14:11:57 · 85 阅读 · 0 评论 -
二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路从题目可以知道,二维数组往下就是递增,往右就是递增,那么我们可以从左下角看就是往上就是递减,往右就是递增,这样以来当目前的数大于target的时候就是往上移动,当目前的数小于tar...原创 2019-03-11 13:52:34 · 85 阅读 · 0 评论 -
最小的K个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题思路这道题我是用建立大根堆的方法做的,做法很直接,直接看代码,这个问题类似top k,但是用这个方法去解决top k问题可能有点复杂。以后会补充。import java.util.Queue;import java.util.PriorityQu...原创 2019-03-15 14:27:58 · 127 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路采用阵地攻守的思想:第一个数字作为第一个士兵,守阵地;count=1;遇到相同元素,count++;遇到不相同元素,即为敌人,同归于尽,count--;当...原创 2019-03-15 13:52:40 · 90 阅读 · 0 评论 -
字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。解题思路附上牛客网大佬的解析https://www.nowcoder.com/questionTerminal/fe6...原创 2019-03-15 13:35:22 · 84 阅读 · 0 评论 -
二叉搜索树与双向链表
题目描述输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点的指针指向。解题思路这道题就是一个中序遍历,先是遍历左子树,然后把头节点赋予给最左边的节点。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right ...原创 2019-03-15 11:23:30 · 88 阅读 · 0 评论 -
复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路 先不管 1 2 3 的关系,分别复制他们节点放进哈希表里 1 -> 1' 2 -> 2' 3 -> 3'...原创 2019-03-15 10:29:05 · 99 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)。解题思路这是一道经典的递归做法,显示遍历根的左子树,然后再遍历右子树,这样递归下去找到的值存放在listAll中。一些代码的疑惑看注释吧import java.util....原创 2019-03-14 18:39:30 · 105 阅读 · 0 评论