剑指offer
我叫程序猿
致力于让解题速度超过LeetCode更新速度
展开
-
【剑指offer】栈的压入,弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)这一题首先要考虑如何设置一个循环条件。显然,必须要遍历pushA数组。import java.util.ArrayList;import java.util.*;public class So原创 2021-03-31 11:02:08 · 40 阅读 · 0 评论 -
【剑指offer #11】二进制中1的个数 Java代码
题目描述输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。解析:本题采用二进制数减1 与原数做与运算public class Solution { public int NumberOf1(int n) { int sum=0; while(n!=0){ n=n&(n-1); sum=sum+1; } return sum; }}...原创 2021-03-29 13:29:11 · 43 阅读 · 0 评论 -
刷完剑指offer,相关知识点总结归纳,避坑。
str.str.trim() 删除字符串首尾空白符;char[ ] arr=str.toCharArray( ); 字符串转化为字符数组;ASCII码中48~57为0到9十个阿拉伯数字。C>=’0’ && C<=’9’ 判断字符C是否为数字;字符串为空或者字符串为0是需要进行判断的。if(str==null || str.length() == 0)return -1;字符串str长度判断 str.length>0数组array长度判断 for(int i原创 2021-03-26 14:23:46 · 72 阅读 · 0 评论 -
【剑指offer#32】把数组排成最小的数--Java代码
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解析:将所有数字两个相加进行大小比较排序,详细见代码;需要注意几个细节,如何将字符串转换为对应的数字。如何将数字转换为对应的字符串;如何声明一个字符串,它的长度为0,两个数中间加“”,会自动转化为String形。import java.util.ArrayList;public class Solution {原创 2021-03-22 15:39:20 · 62 阅读 · 0 评论 -
【剑指offer#28】数组中出现次数超过一半的数字 --Java代码
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解析: 可以直接对数组进行排序,若存在,则中位数和开头或者末尾的数一样,则存在,反正不存在也可以使用map的思路也可以考虑使用众数的定义,采取消除法,若两个数不同,每次消除一对。import java.util.*;public class Solution { publi原创 2021-03-22 14:35:25 · 44 阅读 · 0 评论 -
【剑指offer #19】顺时针打印矩阵--Java代码
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.解析:本题就是考数组的旋转打印,注意边界。import java.util.ArrayList;public class Solution { public ArrayList<Integer> print原创 2021-03-22 11:06:29 · 54 阅读 · 0 评论 -
【剑指offer#13】调整数组顺序使奇数位于偶数前面。
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解析:import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型一维数组 * @return int原创 2021-03-22 10:16:08 · 61 阅读 · 0 评论 -
【剑指offer#7】斐波拉契数列--Java代码
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。解析:本题考察递归求第N项,则第N项由第N-1和N-2项构成;public int Fibonacci(int n)return Fibonacci(n-1)+Fibonacci(n-2);public class Solution { public int Fibonacci(int n) { if(n<=1)return n;原创 2021-03-22 09:46:09 · 74 阅读 · 0 评论 -
【剑指offer#1】二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解析:本题考察二维数组中的查找,相关知识点:1.二维数组的表示。int [] [] array;2.二维数组的行。array.length;3.二维数组的列。array[0].length;二分查找的代码框架while(start<=end){if(target>mid){};if原创 2021-03-22 08:59:09 · 45 阅读 · 0 评论 -
【剑指offer#67】剪绳子--Java代码
题目描述给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。解析:仔细分析题目可知,将绳子划分为3最大,3越多最大乘积越大。但是注意,如何将double转换为int,比较重要,师哥基础知识点(int)import java.util.*;public clas原创 2021-03-19 20:15:21 · 69 阅读 · 0 评论 -
【剑指offer#66】机器人的运动范围--Java代码
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?解析,本题还是属于图的遍历:下面总结图的遍历的主要思路图的遍历主要有两种考察方式,一种是判断图中是否存在某种序列或者路线,另外一种就是判断有多少个点或者多原创 2021-03-19 16:15:44 · 104 阅读 · 0 评论 -
【剑指offer】矩阵中的路径--Java代码
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。解析:本题难度较大,考察回溯,自己先看答案敲一遍,能看懂了后续再细看import java.util.*;原创 2021-03-19 14:16:50 · 65 阅读 · 0 评论 -
【剑指offer】滑动窗口的最大值--Java代码
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,原创 2021-03-18 17:15:09 · 60 阅读 · 0 评论 -
【剑指offer】数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。解析:本题考察大顶堆和小顶堆:用小顶堆存放后半部分的数(大),大顶堆存放前半部分的数(小),这样两个堆的堆顶就是中间的数字。问题是该如何存放。数先放到大顶堆,再从大顶堆中弹出,送入小顶堆,这样可以保证大顶堆中的数永原创 2021-03-18 14:54:20 · 56 阅读 · 0 评论 -
【剑指offer】二叉搜索树的第K个结点
题目描述给定一棵二叉搜索树,请找出其中的第k小的TreeNode结点。解析,本题知识点是二叉搜索树以及中序遍历;二叉搜索树-所以左子树小于当前结点,右子树全部大于当前结点,中序遍历是一个有序的二叉树。中序遍历的知识点要经常复习才不会忘记/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) {原创 2021-03-18 09:26:03 · 42 阅读 · 0 评论 -
【剑指offer#61】序列化二叉树--Java实现
题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。解析:本题比较难,因为此前没有接触过此类题目,主要有3个关键点需要掌握原创 2021-03-17 21:00:36 · 82 阅读 · 0 评论 -
【剑指offer #60】把二叉树打印成多行--Java代码实现
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。使用队列,每一层全部入队,再出队,注意全部入队和全部出队的条件import java.util.ArrayList;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val;原创 2021-03-16 21:00:21 · 57 阅读 · 0 评论 -
【剑指offer#59】按之字形顺序打印二叉树--Java代码
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。解析:这一题用栈,自己写了好久,中间的转换情况有点复杂,还是自己菜的问他,然后还是放弃了,用队列写的这一题;思路比较简单。按照先进先出的原则:第一次进栈【8】第二次进栈【10,6】第三次进栈【5,7,9,11】那么可以看出每次第一个进栈的节点是上一次最后一次进栈的子节点,所以用一个ArrayList保存每次进栈的结点,下一次进栈元素应该从Lis原创 2021-03-16 20:40:59 · 42 阅读 · 0 评论 -
【剑指offer】删除链表中重复的节点--Java代码
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5解析:本题需要创建头结点的前序节点,这很关键ListNode vhead=new ListNode(-1);vhead.next=pHead;ListNode pre=vhead;ListNode cur=pHead;public class ListNode{ i原创 2021-03-15 20:49:09 · 99 阅读 · 2 评论 -
【剑指offer】链表中环的入口节点--Java代码
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null解析1:本题可以直接用hashmap,保存节点和出现的次数。当键已经包含节点的时候,结束循环,输出当前节点,否则node=node.next。具体思路看代码import java.util.*;/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val;原创 2021-03-15 15:29:56 · 70 阅读 · 0 评论 -
【剑指offer】字符流中第一个不重复的字符--Java代码
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。返回值描述:如果当前字符流没有存在出现一次的字符,返回#字符。解析:本题最简单的思路就是采用Hashmap,大门时要注意的一点是,必须要用到LinkedHashMap,HashMap和LinkedHashMap的主要区别是LinkedHashMap存储的键值对是有一定顺序的,先存入的原创 2021-03-15 15:03:46 · 86 阅读 · 0 评论 -
【剑指offer】表示数值的字符串--Java代码
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。解析:分类讨论**/1、e(E)后面只能接数字,并且不能出现2次2、对于+、-号,只能出现在第一个字符或者是e的后一位3、小数点不能放在开头或末尾,不能出现2次,e后面不能出现小数点**/import java.util.*;pu原创 2021-03-15 10:54:08 · 65 阅读 · 0 评论 -
【剑指offer】正则表达式匹配
题目描述请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配解析:首先分析匹配的情况1.字母直接匹配,或者p【0】为·;2.p【1】有*有0个||多个3.p【1】有多个 *import java.util.*;public class Solution {原创 2021-03-15 10:38:28 · 44 阅读 · 0 评论 -
【剑指offer】构建乘积数组--Java代码
题目描述给定一个数组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];)对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。方法1–代码:暴力求解,直接遍历;import java.util.ArrayList;public.原创 2021-03-14 18:04:03 · 42 阅读 · 0 评论 -
【剑指offer】数组中重复的数字--java代码
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中第一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是第一个重复的数字2。没有重复的数字返回-1。思路一:用HashMap求解,键值为数组元素,值为1;遍历数组,直到map中包含;思路二:设置2个指针,遍历数组,若相等,输出该数思路3:因为数字有范围,所以每个位置应该只有该位置的数,遍历数组,进行调换,若原创 2021-03-14 17:59:38 · 68 阅读 · 0 评论 -
【剑指offer】把字符串转换为数字--java实现
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0.解析:本题需要额外知识点,如数字的ASCII为48-57.将字符0-9转换为数字,则需要计算c=c-‘0’。另外字符串转换为数组的代码为 char[] array=str.toCharArray();public class Solution { public int StrToInt(String str) { if(str==null)return原创 2021-03-14 16:07:39 · 160 阅读 · 1 评论 -
【剑指 offer】不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。还没理解透彻,先放代码吧public class Solution { public int Add(int num1,int num2) { while (num2!=0) { int temp = num1^num2; //按照异或操作(不同为1 ,相同为0) num2 = (num1&num2)<<1; //按照与原创 2021-03-14 14:08:50 · 40 阅读 · 0 评论 -
【剑指offer】java代码合集,每一题都有代码注释详解。
自己用java语言刷的剑指offer,每一题都有代码详解以及背景解析,需要用到哪些知识都明确写出了,欢迎各位大佬观看指点。链接如下。链接: 剑指offer67题代码合集–java版.原创 2021-03-14 14:11:25 · 111 阅读 · 0 评论 -
【剑指offer】求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字
题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解析:作为"&&“和”||"操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程便告终止,这称之为短路求值(short-circuit evaluation)使用&&,表示两边都为真,才为真,左边为假,右边就没用了。因此在不断递归时,直到左边为假时,才不执行右边。因此在第一次进行右边的判断原创 2021-03-13 16:41:41 · 136 阅读 · 0 评论 -
【剑指offer】圆圈中最后剩下的数字--Java代码
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!_)。请你试着想下,哪个小朋友会得原创 2021-03-13 15:59:02 · 60 阅读 · 0 评论 -
【剑指offer】扑克牌顺子--java代码
题目描述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-13 14:51:02 · 77 阅读 · 0 评论 -
【剑指offer】翻转单词顺序
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?解析:对于翻转类的题目,首先考虑能否用栈解决,因为栈的先进后出的特性,容易解决带有翻转之类的题目。本题以空格为界限,空格之前的字符全部原创 2021-03-13 13:22:59 · 71 阅读 · 0 评论 -
【剑指offer】左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!解析:题目比较简单,考察str的放应用,当然也可以再创建一个字符串;public class Solution { public String LeftRotateString(String str,原创 2021-03-13 10:06:20 · 61 阅读 · 0 评论 -
【剑指offer#42】和为S的两个数--Java代码
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。解析:思路比较简单,因为是递增序列,所以设置两个指针,直接遍历,第一次遇见的和为S的两个数即为答案。import java.util.ArrayList;public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {原创 2021-03-13 09:36:55 · 55 阅读 · 0 评论 -
【剑指offer#42】求和为S的连续正整数-Java代码实现
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!解析:和为S的连续正整数,所以可以...原创 2021-03-13 09:34:14 · 56 阅读 · 0 评论 -
【剑指Offer】找出数组中只出现过一次的数字--java
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解析:诸如此类多少次的题目,基本上都可以用来HashMap做。import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型一维数组 * @return int整型一维数组原创 2021-03-12 11:00:41 · 146 阅读 · 0 评论 -
【剑指offer#35】求逆序对(考察归并排序)
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007public class Solution { int sum=0; public int InversePairs(int [] array) { if(array.length==0||array.length==1)return 0; meger_so原创 2021-03-10 20:57:34 · 49 阅读 · 0 评论 -
【剑指offer#37】统计一个数字在升序数组中出现的次数
题目描述统计一个数字在升序数组中出现的次数。代码1:自己用的HashMap方法,比较简单,但是不是面试时的方法。(题目提到有序,一定要想到二分,二分查找的前提就是有序)import java.util.HashMap;public class Solution { public int GetNumberOfK(int [] array , int k) { if (array.length==0||array==null)return 0;原创 2021-03-11 14:15:10 · 111 阅读 · 0 评论 -
【剑指Offer】求两个链表的第一个公共节点
题目描述输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)解析:解这一题,首先要明白什么是公共节点,自己第一次写,把公共节点当成了节点值相等,AC不通,这里的公共节点指的是指针指向同一个节点,(原本是并排的两条线,突然合二为一了)节点相等,节点值一定相等,节点值相等,节点不一定相等,有公共节点,代表,两个链表共用一个节点/*public class ListNode { int val; ListNod原创 2021-03-10 22:18:56 · 69 阅读 · 0 评论