剑指offer
记录自己刷剑指offer的题集
爱敲代码的小黄
我是爱敲代码的小黄,阿里淘宝集团的Java开发工程师,CSDN博客专家,阿里云专家博主。写过的专栏:Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码系列、duubo源码系列,期待和大家一起学习,一起进步,一起对抗互联网寒冬
展开
-
【剑指offer】- 数组中重复的数字 -48/67
1. 题目描述在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 32. 题目分析此题考查的是面试者的沟通能力,在面试官给出此题时,要询问面试官允许的时间复杂度和空间复杂度关于此题,有三种解法,对应着三种不同的时间空间复杂度:排序: 时间: O(nlogn) 空间O(1)H原创 2020-07-19 14:17:04 · 285 阅读 · 0 评论 -
【剑指offer】- 求1+2+3+...+n -47/67
1. 题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。2. 题目分析对于这种求1+2+3+…+n的题,我们可以采取3中方法第一种:直接利用等差数列的思想来进行求和return (1 + n) * n / 2;第二种:利用迭代的思想进行求和int res = 0; for(int i = 1; i <= n; i++) res += i; return res;第三种:利用递归的方式进行求和i原创 2020-07-18 22:10:01 · 215 阅读 · 0 评论 -
【剑指offer】- 把字符串转换成整数 -46/67
1. 题目描述2. 题目分析对于字符串转为整数,比较简单,这里主要考察的是对于空指针、空字符串、非法输入、全部空格、是否溢出等一些特殊情况首先,我们先考虑有空指针和空字符串情况,if (str.length() == 0) return 0;空格情况,我们通过str.trim()去除空格,然后判断是否全为空格if (c.length == 0) { return 0; }这时候,我们原本的字符串空格已经被我们处理掉了,我们需要判断字符串的正负性,便于我们之后的输出和遍历的开始下标。如原创 2020-07-17 15:55:48 · 272 阅读 · 0 评论 -
【剑指offer】- 按之字形顺序打印二叉树-45/67
1. 题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。2. 题目分析首先该题类似于—【剑指offer】-把二叉树打印成多行-43/67唯一不同的地方,在于左右输出,我们这里一般有3种方法来做第一种,也是比较容易想到的一种,我们在储存List的时候,分成偶奇位,偶数的话,实施Collections.reverse(list2);第二种,使用双向队列,双向队列的解释,奇数层的话,用TreeNod原创 2020-07-16 17:50:06 · 183 阅读 · 0 评论 -
【剑指offer】-扑克牌顺子-44/67
1. 题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦原创 2020-07-13 02:16:23 · 229 阅读 · 0 评论 -
【剑指offer】-把二叉树打印成多行-43/67
1. 题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。2. 题目分析非常经典的一道二叉树的题目,做这道题之前需要掌握二叉树的思想和BFS(广度优先搜索、队列思想)我们可以回顾一下最基本的层次遍历,我们是用一个队列来进行存储初始root结点,然后依次放入root的左子树和右子树,循环上述操作 while (!queue.isEmpty()) { TreeNode treeNode = queue.poll(); if (treeNode.left != nul原创 2020-07-13 01:26:44 · 207 阅读 · 0 评论 -
【剑指offer】-构建乘积数组-42/67
1. 题目描述给定一个数组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]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)2. 题目分析我们可以比较清晰的看出,B数组中的值等于A数组中的值所有的乘积(不包括B下标)类似于:B[1] = A[0] * A[2] * A[3] * A[4]原创 2020-07-12 23:12:43 · 169 阅读 · 0 评论 -
【剑指offer】-左旋转字符串-41/67
1. 题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!2. 题目分析暴力方法(新开辟一个字符串):将前n位存储在新开辟的字符串里,然后分割其剩下的字符串,最后加在一起,进行返回。获得offer做法:...原创 2020-07-11 00:16:34 · 191 阅读 · 0 评论 -
【剑指offer】-翻转单词序列-40/67
1. 题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?2. 题目分析个人做法:题目给定一个字符串““student. a am I””,让你对其进行操作,变成“I am a stu原创 2020-07-10 23:37:22 · 251 阅读 · 1 评论 -
【剑指offer】-和为S的连续正数序列-39/67
1. 题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!2. 题目分析给你一个数字sum,让你在0~sum之间求连续数字加起来等于sum的序列首先,比较好想的是O(n*n)的做法,外层从1到sum,内原创 2020-07-06 01:12:06 · 192 阅读 · 0 评论 -
【剑指offer】-和为S的两个数-38/67
1. 题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。2. 题目分析使用双指针法,分别指向开头和结尾如果:if (array[left] + array[right] > sum) 则 right--;如果:array[left] + array[right] < sum 则 left++;3. 题目代码public ArrayList<Integer> FindNumbersW原创 2020-07-06 00:44:25 · 162 阅读 · 0 评论 -
【剑指offer】-平衡二叉树-37/67
1. 题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树2. 题目分析对于一个二叉树是否为平衡二叉树,我们主要判断其左子树和右子树的深度是否小于等于1;用递归来实现,判断当前的左子树和右子树差值是否小于等于1,进而判断其是不是平衡二叉树3. 题目代码public class Solution { private boolean isBalanced=true; public boolean IsBalanced_S原创 2020-07-05 19:26:24 · 240 阅读 · 0 评论 -
【剑指offer】-二叉树的深度-36/67
1. 题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。2. 题目分析对于二叉树的深度求值,采取递归,递归其左子树和右子树中最大的+1(root结点),最后返回即3. 题目代码public class Solution { public int TreeDepth(TreeNode root) { if (root == null) { return 0; } else { int h2 =原创 2020-07-05 19:09:42 · 224 阅读 · 0 评论 -
【剑指offer】-数组中只出现一次的数字-35/67
1. 题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。2.题目分析这题类似于【剑指offer】- 第一个只出现一次的字符位置-33/67我们需要了解一些关于二进制的符号:一)按位与&两位全为1,结果才为10&0=0;0&1=0;1&0=0;1&1=1(二)按位或 |只要有一个为1,结果就为1。0|0=0; 0|1=1;1|0=1;1|1=1;(三)异或 ^两个相应位为“异”(原创 2020-07-04 23:20:43 · 158 阅读 · 0 评论 -
【剑指offer】- 第一个只出现一次的字符位置-34/67
1. 题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)2. 题目解析给定一个字符串,让你求这个字符串只出现一次的字符,我们一般的想法都是遍历一遍字符串,依次和后面的相比较,如果一样的话,就去掉。这里的时间复杂度为(On*n)我们可以通过java中的hashmap去做,遍历一遍字符串,判断这个字符在不在hashmap中,如果不在,则输入map.put(str.ch原创 2020-07-04 21:26:37 · 186 阅读 · 0 评论 -
【剑指offer】-把数组排成最小的数-33/67
1. 题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。2. 题目描述题目的意思:给你一个数组,要求你返回一个字符串,为这些数组中最小的数(字符串)我们需要对数组内的数字进行排序,这里进行的排序指的是对其在数组内的位置进行排序,这里我们需要一个规则,如果NM > MN,则N>M;这里的大于不是常规的大于关系,是我们自己定义的一个关系将数组依次存入Arr原创 2020-07-04 21:03:26 · 186 阅读 · 0 评论 -
【剑指offer】-数字在排序数组中出现的次数-32/67
1. 题目描述统计一个数字在排序数组中出现的次数。2. 题目分析题主一开始的方法:看见有序,使用二分,查找到target,向前向后分别遍历到不等于target的数字,因为数组中的target出现的次数是不确定的,所以,可能查找到n次,相当于O(n);面试中,这种写法会被paas掉,所以我们需要用二分查找找到第一次出现target的下标,最后一次出现target的下标,对于target出现的第一次下标,采用以下方式当mid == 0的时候,也就是证明当前的数是从下标0开始的,则直接返回0(mid原创 2020-07-01 17:36:45 · 181 阅读 · 0 评论 -
【剑指offer】-1~n整数中1出现的次数-31/67
1. 题目描述求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下113中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。2. 题目分析最常见做法和想到的就是从1~n依次遍历,然后遍历每一个数字的每一位数,判断其是不是等于1,累加return这是介绍一种新的解法,类似找规律的样子...原创 2020-06-29 18:36:50 · 295 阅读 · 0 评论 -
【剑指offer】-连续子数组的最大和-30/67
一、题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)二、题目分析如果给定的数字都是正数,则直接相加就可以原创 2020-05-26 18:55:21 · 254 阅读 · 0 评论 -
【剑指offer】-最小K个数-28/67
一、题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。二、题目分析典型的排序题目,直接使用-快速排序注意一下,input数组的空值和input.length的值与K值的比较三、题目代码package offer;import java.util.ArrayList;/* * 最小K个数 */public class Test28 { static ArrayList<Integer>原创 2020-05-26 13:42:25 · 211 阅读 · 0 评论 -
【剑指offer】-数组汇总出现次数超过一半的数字-27/67
一 、题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。二、 题目分析这个数字存在次数一定是最多的,我们可以用守擂法定义一个num(代表当前的数字)和sum(代表当前的次数)如果遇见一样的,就进行sum++,不一样的就sum–,同时要看sum的值,如果sum为0的话,表示这个数字不是我们要找的,需要将num的值进行替换最后,重新原创 2020-05-26 13:29:28 · 265 阅读 · 0 评论 -
【剑指offer】-字符串的排列-26/67
1. 题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。2. 输入描述输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。3. 题目分析...原创 2020-05-15 18:34:21 · 235 阅读 · 0 评论 -
【剑指offer】-复杂链表的复制-25/67
1. 题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)2. 题目分析链表中是有2个指针的,一个指向下一个节点,一个是指向随机的节点想复制链表的话,第一步要复制链表 // 复制链表 Ran...原创 2020-05-04 21:28:51 · 136 阅读 · 0 评论 -
【剑指offer】-二叉树中和为某一值的路径-24/67
1. 题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。2. 题目分析首先,我们要明白路径指的是什么如上所示,路径有4条,分别为:1——>2——>4 路径值:71——>2——>5——>7 路径值:151——>2——>5...原创 2020-05-03 15:42:40 · 146 阅读 · 0 评论 -
【剑指offer】-二叉搜索树的后序遍历序列-23/67
1. 题目描述输入一个非空整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。2. 题目分析题目给的是一个二叉搜索树后序遍历的数组二叉搜索树特点:左子树<root<右子树后序遍历的特点:最后一个数是根节点(root)我们首先验证极端情况:该数组为空,返回false。我们找到数组最后一个数字,也就...原创 2020-04-26 22:50:51 · 253 阅读 · 0 评论 -
【剑指offer】-从上往下打印二叉树-22/67
1. 题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。2. 题目分析(1)一道二叉树经典的例题,二叉树的层次遍历(2)大致思想就是,创建一个队列,将根节点(root)加入,分别遍历他的左子树和右子树,遍历左子树的同时,将左子树的左子树和右子树加入队列,遍历右子树的同时,将左子树的左子树和右子树加入队列。(3)依次类推,最后返回List。3. 题目代码public sta...原创 2020-04-25 20:34:19 · 181 阅读 · 0 评论 -
【剑指offer】-包括main函数的栈-21/67
1. 题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。2. 题目分析该题有二种解决方法(1 )常规解决思路:在写min()方法的时候,建立一个辅助栈,v...原创 2020-04-24 22:58:57 · 217 阅读 · 0 评论 -
【剑指offer】-栈的压入、弹出序列-20/67
1. 题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)2. 题目分析题目的大致意思是:给你一个栈压入序列A:1 2 3 4 5 ,...原创 2020-04-15 22:20:33 · 220 阅读 · 0 评论 -
【剑指offer】-顺时针打印矩阵-19/67
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10....原创 2020-04-09 21:47:23 · 203 阅读 · 0 评论 -
【剑指offer】-二叉树的镜像-18/67
1. 题目描述操作给定的二叉树,将其变换为源二叉树的镜像。2. 输入描述:3. 题目分析简单来说,就是进行左右子树的交换对于这种问题,我们一般使用递归来解决用一个TreeNode类型的结点,来保存左右子树,实现左右子树的交换4. 题目代码public class Solution { public void Mirror(TreeNode root) { ...原创 2020-04-06 17:45:34 · 145 阅读 · 0 评论 -
【剑指offer】-树的子结构-17/67
1. 题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)2. 题目分析两颗二叉树A和B,右边的树B是左边树A的子结构要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:a. 第一步,在树A种找到和树B的根节点的值一样的节点R;b. 第二步,判断树A中以R为根节点的子树是不是包括和树B一样的结构。以上面的两棵树来分析这个过程...原创 2020-04-06 17:18:58 · 138 阅读 · 0 评论 -
【剑指offer】-合并两个排序的链表-16/67
1. 题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。2. 题目分析考虑两个链表是否为null,如果是null的话,返回另一个链表设置两个结点:p1、p2分别指向list1、list2,创建一个空链表list3,并设置p3结点指向list3分别遍历两个链表并比较,得出最后注意:返回的是list3.next。因为此时p3开始的值为原始...原创 2020-04-03 22:16:05 · 162 阅读 · 0 评论 -
【剑指offer】-反转链表-15/67
你好,我是苦酒欢迎访问我的个人博客:苦酒目录1. 题目描述2. 题目分析3. 题目代码1. 题目描述输入一个链表,反转链表后,输出新链表的表头。2. 题目分析链表如下所示:. 首先,定义三个结点,分别指向如下:p1 = null;p2 = head;p3 = head.next;将p2.next(此刻连接1~2的剪头)指向p1,如下所示:可以看到,第一个结点(1)已经...原创 2020-04-02 15:24:13 · 421 阅读 · 0 评论 -
【剑指offer】-链表中倒数第K个结点-14/67
题目描述输入一个链表,输出该链表中倒数第k个结点 List item原创 2020-04-01 16:59:35 · 127 阅读 · 0 评论 -
【剑指offer】-调整数组顺序使奇数位于偶数前面-13/67
1. 题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。2. 题目分析第一个做法:以时间换空间,复杂度O(n²)1. 遍历数组array,利用num来记录当前奇数的个数2. 当遍历到奇数时,利用交换的思想,将此时的奇数交换至array[num]的位置3. 最...原创 2020-04-01 16:55:03 · 143 阅读 · 0 评论 -
【剑指offer】-数值的整数次方-12/67
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0题目分析题目有两种方法1.直接使用暴力遍历来做2.使用一种新算法:快速幂暴力遍历复杂度O(n),不提倡。这里主要讲解一下快速幂。对于快速幂:时间复杂度O(logb)我们已知 2^3 求 2^6,不就是 2^3 *...原创 2020-03-25 17:47:55 · 256 阅读 · 0 评论 -
【剑指offer】-二进制中1的个数-11/67
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。题目分析首先要明确,在计算机中,负数是按照补码的形式存在的,所以该题不需要考虑正负的问题本题采用二进制的方法,把当前数字转为二进制,依次判断每个位置是不是等于1如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的...原创 2020-03-24 21:24:01 · 134 阅读 · 0 评论 -
【剑指offer】-矩形覆盖-10/67
题目描述我们可以用2 * 1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2 * 1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:题目分析1. 当n = 1 时,有1种2. 当n = 2 时,有2种3. 当n = 3 时,有3种4. 所以,递推的关系为: f(n) = f(n-1)+ f(n-2)题目代码class So...原创 2020-03-20 17:49:28 · 182 阅读 · 0 评论 -
【剑指offer】-变态跳台阶-09/67
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。题目分析在上一个问题上又加深的一道题目:跳台阶分析:当台阶为1时,跳:1,跳法:1当台阶为2时,跳:2 || 1 1,跳法:2当台阶为3时,跳:1 2 || 1 1 1 || 2 1 || 3,跳法:4当台阶为4时,跳:2 2 || 1 1 1 1 || 1 2...原创 2020-03-17 13:30:19 · 131 阅读 · 0 评论 -
【剑指offer】-跳台阶-08/67
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。题目分析对于1层台阶,只有 1,一种跳法对于2层台阶,1 1 或者 2,两种跳法对于3层台阶,1 1 1 或者 1 2 或者 2 1,3种跳法代码实现class Solution {public: int jumpFloor(int number...原创 2020-03-17 13:16:06 · 189 阅读 · 0 评论