![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer
Xechos
博观而约取,厚积而薄发
展开
-
【剑指Offer】扑克牌顺子
题目描述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决定去买体育彩票啦。 现原创 2021-03-03 23:21:10 · 144 阅读 · 0 评论 -
【剑指Offer】孩子们的游戏(圆圈中最后剩下的数)
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友原创 2021-03-03 23:20:18 · 133 阅读 · 0 评论 -
【剑指Offer】左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!示例1输入“abcXYZdef”,3返回值“XYZdefabc”解题思路构建新的字符串,先将传入的字符串后端部分追加,在追加前端部分。代码public class Solutio原创 2021-02-19 22:34:18 · 130 阅读 · 0 评论 -
【剑指Offer】数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解题思路遍历一遍数组,用HashMap记录数字出现的次数,然后遍历map,找出出现1次的数字。代码import java.util.HashMap;//num1,num2分别为长度为1的数组。传出参数//将num1[0],num2[0]设置为返回结果public class Solution { public void FindNumsAppearOnce(int [] array,i原创 2021-02-19 22:29:17 · 115 阅读 · 0 评论 -
【剑指Offer】平衡二叉树
【剑指Offer】二叉树的深度原创 2021-02-19 22:07:56 · 80 阅读 · 0 评论 -
【剑指Offer】二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。示例1输入{1,2,3,4,5,#,6,#,#,7}返回值4解题思路递归数据结构树的遍历/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val)原创 2021-02-04 19:36:37 · 142 阅读 · 0 评论 -
【剑指Offer】数字在排序数组中出现的次数
题目描述统计一个数字在升序数组中出现的次数。示例1输入[1,2,3,3,3,3,4,5],3返回值4解题思路直接遍历数组是有序数组,可以直接遍历数组,记录数字k在数组中出现的次数。public class Solution { public int GetNumberOfK(int [] array , int k) { int res = 0; for (int i = 0; i < array.length; i++)原创 2021-02-04 19:04:22 · 89 阅读 · 1 评论 -
【剑指Offer】两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)解题思路链表a的长度为len1,链表b的长度为len2len1 != len2但len1+len2 = len2+len1代码/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val;原创 2021-02-05 20:38:31 · 122 阅读 · 0 评论 -
【剑指Offer】第一个只出现一次的字符位置
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)示例1输入“google”返回值4解题思路遍历字符串,记录每个字符出现的次数,使用LinkedHashMap存储。再次遍历Map找到第一个只出现一次的字符,返回字符在字符串中的位置。代码import java.util.LinkedHashMap;public class Soluti原创 2021-02-05 20:40:35 · 119 阅读 · 0 评论 -
【剑指Offer】数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。示例1输入[1,2,3,2,2,2,5,4,2]返回值2解题思路使用Map存储数组中的元素、以及出现的次数。再次遍历Map,当数字出现的数字超过数组长度的一半,返回当前的key,否则返回0。时间复杂度:O(n)空间复杂度:O(n)代码import jav原创 2021-02-02 00:07:55 · 80 阅读 · 0 评论 -
【剑指Offer】复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路参考博主的思路,如图片的水印。代码/*public class RandomListNode { int label; RandomListNode next = null; RandomListNode random =原创 2021-02-02 00:06:55 · 85 阅读 · 0 评论 -
【剑指Offer】二叉树中和为某一值的路径
题目描述输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。示例1输入{10,5,12,4,7},22返回值[[10,5,7],[10,12]]示例2输入{10,5,12,4,7},15返回值[]解题思路代码import java.util.ArrayList;/**public class TreeNode { int val =原创 2021-01-08 14:53:54 · 85 阅读 · 0 评论 -
【剑指Offer】二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。示例1输入[4,8,6,12,16,14,10]返回值true解题思路我们知道二叉搜索树,左子树<根结点<右子树。后序遍历,最后一个结点为根结点,因此绿色的10为根结点。遍历数组,找到第一个大于根结点的结点,说明前面的为左子树继续向后遍历,如果有小于根结点的,则返回false,否则,后面的为右子树递归进行原创 2021-01-08 14:16:01 · 86 阅读 · 0 评论 -
【剑指Offer】从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。示例1输入{5,4,#,3,#,2,#,1}返回值[5,4,3,2,1]解题思路数的层次遍历。代码import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;/**public class TreeNode { int val = 0; TreeNode left = null; Tr原创 2021-01-07 19:21:42 · 74 阅读 · 0 评论 -
【剑指Offer】包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。解题思路声明两个栈,一个记录数据,另一个记录最小数据当前的最小数据。例如:依次压入3,4,2,5,0。因此dataStack为3,4,2,5,0,minStack为3,3,2,2,0每次出栈,不仅要把dataStack栈顶元素弹出,还要把minStack栈顶元素弹出。显然空间复杂度较高。import java.util.Stack;public class Solution {原创 2021-01-06 14:09:24 · 95 阅读 · 0 评论 -
【剑指Offer】顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.示例1输入[[1,2],[3,4]]返回值[1,2,4,3]解题思路代码import java.util.ArrayList;public class Solution { public Ar原创 2021-01-06 14:09:02 · 86 阅读 · 0 评论 -
【剑指Offer】二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:解题思路分别交换结点的左右子树,对子树进行相同操作。代码/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution {原创 2021-01-05 12:52:49 · 76 阅读 · 0 评论 -
【剑指Offer】合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。示例1输入{1,3,5},{2,4,6}返回值{1,2,3,4,5,6}解题思路两个单调递增的链表依次比较list1和list2的结点,将小的结点链接到q后,指针相应的移动。代码/*public class ListNode { int val; ListNode next = null; ListNode(int val) {原创 2021-01-05 12:51:41 · 106 阅读 · 0 评论 -
【剑指Offer】反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。示例1输入{1,2,3}返回值{3,2,1}解题思路头插法/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode ReverseList(L原创 2021-01-04 12:28:37 · 65 阅读 · 0 评论 -
【剑指Offer】链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。示例1输入1,{1,2,3,4,5}返回值{5}解题思路(1)直接循环遍历,计算出总共有n个结点,再遍历一次,找到n-k个结点。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution原创 2021-01-04 12:27:47 · 91 阅读 · 0 评论 -
【剑指Offer】调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路import java.util.ArrayList;import java.util.List;public class Solution { public void reOrderArray(int [] array) { List<Integer> list = new Arr原创 2021-01-04 12:26:24 · 61 阅读 · 0 评论 -
【剑指Offer】数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0示例1输入2,3-返回值8.00000解题思路很多语言都提供了这个函数,想看看源码,可惜。^~^public class Solution { public double Power(double base, int exponent) { return Math.pow(base, expone原创 2021-01-04 12:25:21 · 53 阅读 · 0 评论 -
【剑指Offer】二进制中1的个数
题目描述输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。示例1输入10返回值2解题思路代码原创 2021-01-04 12:24:18 · 66 阅读 · 0 评论 -
【剑指Offer】矩形覆盖
题目描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:示例1输入4返回值5解题思路这个题目与跳台阶那个题目类似。当然也可以使用递推方法,推出规律:n=1:1种n=2:2种n=3:3种n=4:5种……F(n)=F(n-1)+F(n-2)递归public class Solution { public int RectCover原创 2021-01-04 12:23:27 · 75 阅读 · 0 评论 -
【剑指Offer】变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。示例1输入3返回值4解题思路在剑指Offer的跳台阶中,如果下一步是n阶台阶,则只有两种可能,一种是在n-1阶台阶,二种是在n-2阶台阶,因此F[n]=F[n-1]+F[n-2]。现在有n种,F[n]=F[n-1]+F[n-2]+F[n-3]+……+F[2]+F[1]+F[0]其中:F[0]=F[1]=1直接循环public class Solut原创 2021-01-04 12:22:47 · 67 阅读 · 0 评论 -
【剑指Offer】跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。示例1输入1返回值1示例2输入4返回值5解题思路如果下一步是n阶台阶,则只有两种可能,一种是在n-1阶台阶,二种是在n-2阶台阶,因此F[n]=F[n-1]+F[n-2]。我们可以清楚地知道:(1)n=1时,只有一种可能,即F[1]=1(2)n=2时,有两种可能,即F[2]=2递归public class Sol原创 2021-01-04 12:21:45 · 54 阅读 · 0 评论 -
【剑指Offer】斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n≤39示例1输入4返回值3解题思路递归F(0)=0,F(1)=1F(n)=F(n - 1)+F(n - 2)(n ≥ 2)public class Solution { public int Fibonacci(int n) { if(n==0 || n==1) return n; r原创 2021-01-04 12:20:49 · 99 阅读 · 0 评论 -
【剑指Offer】旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。示例1输入[3,4,5,1,2]返回值1解题思路暴力解决寻找数组的最小值,直接可以暴力解决,遍历一遍数组,查找到最小值。显然,这不是最优解,也不是题目希望看到的。import java.util.ArrayList;public class Solution {原创 2021-01-04 12:19:29 · 66 阅读 · 0 评论 -
【剑指Offer】用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路模拟一遍:(1)首先插入1,2,3,4,栈的情况:stack1={1,2,3,4};stack2={}(2)删除一个元素,由于1是最先插入的,所以1应该最先删除,因此需要将2,3,4压入stack2中,删除1,栈的情况:stack1={};stack2={4,3,2}(3)继续删除一个元素,2是第二个插入的,因此直接从stack2中出栈(4)插入一个元素5,将5压入stack1(5)继续删除两原创 2020-12-19 19:48:50 · 102 阅读 · 2 评论 -
【剑指Offer】重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路代码...原创 2020-05-18 21:27:20 · 105 阅读 · 0 评论 -
【剑指Offer】从尾到头打印链表
题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。解题思路循环取出ListNode中的元素,将其加入到ArrayList的0号位置。代码/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }**/import j原创 2020-05-18 01:40:03 · 123 阅读 · 0 评论 -
【剑指Offer】替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思路循环查找空格,将空格替换为%20代码C++class Solution{public: void replaceSpace(char *str,int length) { string res; for(int i=0;i<length;i++) { if(str[i]==原创 2020-05-14 00:19:57 · 111 阅读 · 0 评论 -
【剑指Offer】二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路代码class Solution {public: bool Find(int target, vector<vector<int>> array) ...原创 2020-04-30 13:23:29 · 88 阅读 · 0 评论