剑指offer系列
ThunderWay
北京工业大学计算机研究生就读
展开
-
复制带随机指针的链表
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深拷贝。我们用一个由n个节点组成的链表来表示输入/输出中的链表。每个节点用一个[val, random_index]表示:val:一个表示Node.val的整数。random_index:随机指针指向的节点索引(范围从0到n-1);如果不指向任何节点,则为...原创 2020-03-29 15:23:33 · 83 阅读 · 0 评论 -
矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:思路:和青蛙跳台阶同理,n = 1的时候一种,n = 2的时候两种,n = 3的时候三种。。。f(n) = f(n - 1) + f(n - 2);public class Solution { public int RectCover(int target) { if(targ...原创 2020-09-20 16:27:15 · 63 阅读 · 0 评论 -
把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。//思路:如果字符串x+y > y+x,说明x比y大,根据字典顺序y应该排在前面,这里就需要排序。public class Solution { public String PrintMinNumber(int [] numbers) { if(numbers.length == 0 ...原创 2020-09-19 17:13:48 · 132 阅读 · 0 评论 -
字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。//思路:用LinkedHashMap,这个和HashMap的区别是这个可以保证迭代的顺序。import java.util.LinkedHashMap;public class Solution { ..原创 2020-09-19 11:29:32 · 87 阅读 · 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]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。//思路:https://leetcode-cn.com/proble原创 2020-09-19 10:45:37 · 67 阅读 · 0 评论 -
丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。//思路:三个指针,开辟三个数组,分别存放质因子为2、3、5丑数,因为会有重复,每次如果重复指针同时加加public class Solution { public int GetUglyNumber_Solution(int index) { if(index <= 0){...原创 2020-09-18 20:26:53 · 80 阅读 · 0 评论 -
把字符串转换成整数
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0示例1输入复制+21474836471a33输出复制21474836470//思路:主要注意的问题是防止溢出和越界。public class Solution { public int StrToInt(Stri..原创 2020-09-17 17:30:16 · 279 阅读 · 0 评论 -
扑克牌顺子
题目描述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-09-17 11:24:35 · 133 阅读 · 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,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2原创 2020-09-16 21:29:05 · 85 阅读 · 0 评论 -
和为S的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!//思路:滑动窗口,左边界和右边界都只能往右移动。import java.util.ArrayList;public class Solution原创 2020-09-15 17:40:48 · 66 阅读 · 0 评论 -
连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)思路:参考lc;public class Solut原创 2020-09-15 17:30:07 · 50 阅读 · 0 评论 -
数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0。//思路:快速幂public class Solution { public double Power(double base, int exponent) { if(base==0){ return 0; } long n = exponen...原创 2020-08-12 21:14:06 · 62 阅读 · 0 评论 -
不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。//思路:除了进阶位,其他位与异或操作相同;进阶位与与操作相同。public class Solution { public int Add(int num1,int num2) { while(num2 != 0){ int num = (num1 & num2) << 1; num1 = num1 ^ num2;...原创 2020-08-12 17:08:18 · 68 阅读 · 0 评论 -
二进制中1的个数
题目描述输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。两步:1. 最后一位与1&操作,1得1,0得0;2. 右移一位每次。原创 2020-08-11 17:53:00 · 96 阅读 · 0 评论 -
树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)//思路见:大佬链接;/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/import java.util.Stack;...转载 2020-08-05 18:04:21 · 83 阅读 · 0 评论 -
对称的二叉树
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。//用一个队列进行存储,每次从两边往中间靠拢判断值是不是相等。左的左,右的右。/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val;...原创 2020-08-04 21:14:08 · 78 阅读 · 0 评论 -
二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。//思路:先中序遍历该BST,然后依次放入list,再对list进行处理,左右指针。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val ...原创 2020-08-02 21:52:28 · 87 阅读 · 0 评论 -
按之字形打印二叉树
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。//思路:和按层遍历思路类似,不过是设置一个布尔类型的变量flag,奇数行false,偶数行true,ArrayList有个api,add(int index, Object);import java.util.ArrayList;import java.util.Queue;import java.util.LinkedList;/*p原创 2020-07-31 21:57:42 · 92 阅读 · 0 评论 -
把二叉树打印成多行
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。//思路:也是每一层放到队列里然后出队。import java.util.ArrayList;import java.util.Queue;import java.util.LinkedList;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public Tre...原创 2020-07-30 22:38:17 · 128 阅读 · 0 评论 -
二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。//思路:递归和非递归。非递归是按层次遍历,用队列每一层加入队列然后出队列。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val =...原创 2020-07-30 22:23:05 · 530 阅读 · 0 评论 -
和为S的两个数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。//思路:双指针,首位开始。import java.util.ArrayList;public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { //1 2 3 4 5 6 ArrayLi...原创 2020-07-18 20:59:21 · 115 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(intx){val=x;}*}*/classSolution{...原创 2020-07-01 20:08:04 · 76 阅读 · 0 评论 -
替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。//思路:因为String字符串是常量,是不可变的,所以这里需要用到StringBuilder或者StringBuffer字符缓冲区,由于是单线程StringBuilder比StringBuffer速度要快,所以这里用SB字符串缓冲区就可以,对字符串进行分割成单个字符,当字符为空append%20,不为空append原值,最后返回字符串原创 2020-06-12 02:39:06 · 103 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。//思路:将数组中出现的数字的次数放到哈希表中做一个统计,如果次数大于数组长度的一半就返回这个数字,否则返回0import java.util.HashMap;public class Solution { public int MoreThanHalfNum_Solut..原创 2020-06-08 00:10:13 · 82 阅读 · 0 评论 -
第一个只出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)//思路:利用哈希函数,将字符串的每一个字符进行遍历,将其放入哈希表,并计算相对应的出现的次数;然后再进行第二次遍历,如果对应的次数等于1,直接返回。import java.util.HashMap;public class Solution { public int FirstNotRepeat...原创 2020-06-07 21:15:04 · 95 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。//思路:借助一个栈,先放进去,弹出来就是相反的顺序。/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }**/import java.util.ArrayL...原创 2020-05-29 19:39:00 · 77 阅读 · 0 评论 -
从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。//思路:因为从上往下依次打印,所以按层次需要一个队列,因为队列的结构是先进先出。import java.util.ArrayList;/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = nu...原创 2020-04-27 16:22:08 · 63 阅读 · 0 评论 -
二叉搜索时的第k个节点
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。//思路:因为二叉搜索树就是中序遍历依次升序的结果,所以采用非递归的方式中序遍历,定义一个计数器,当计数器与k值相等的时候,就返回这个节点。/*public class TreeNode { int val = 0; TreeN...原创 2020-04-18 11:36:44 · 96 阅读 · 0 评论 -
平衡二叉树
110. 平衡二叉树难度简单291给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。示例 1:给定二叉树[3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回true。/**//注意:...原创 2020-04-18 11:13:03 · 97 阅读 · 0 评论 -
序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍...原创 2020-04-17 01:20:27 · 109 阅读 · 0 评论 -
二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。//思路:如果这个节点的右子树不为空,则下一个结点为该右字树的最左边的节点,如果为空,则从下往上找,当parent.left=node的时候,就是parent节点。/*public class TreeLinkNode { int va...原创 2020-04-16 02:06:56 · 64 阅读 · 0 评论 -
链表中倒数第k个节点
题目描述输入一个链表,输出该链表中倒数第k个结点。//思路:快慢指针,一个快指针,一个慢指针,让快指针先走k个数,然后快慢指针一块走,当快指针到终点的时候,慢指针正好来到倒数第k个位置。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { th...原创 2020-03-27 00:55:08 · 59 阅读 · 0 评论 -
顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.//因为题目中最后返回一个ArrayList集合,所以这里不采用函数,直接在原函数中进行行和列的增减,将数字存到集...原创 2020-03-21 15:18:36 · 50 阅读 · 0 评论 -
《剑指offer》栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:1. 进行判断,如果序列为空或者两个序列长度不等,返回false2....原创 2019-10-31 20:39:54 · 76 阅读 · 0 评论 -
《剑指offer》数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:1. 利用HashMap,首先将所有值作为key存起来,如果是只出现一次,value为1,如果出现两次,value为2。2.定义一个变量计数器,然后进行遍历,当通过key获得的value为1时,将值存进第一个num1【0】,count++;再次通过key获得的value为1时,...原创 2019-10-27 22:20:40 · 97 阅读 · 0 评论 -
《剑指offer》两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。思路:1.要么两个链表有公共结点,停下来,要么两个链表同时遍历到结尾为空,停下来,否则就一直遍历下去/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; ...原创 2019-10-26 17:12:38 · 55 阅读 · 0 评论 -
《剑指offer》删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路:1. 定义一个头结点,头结点的next指向该链表2.定义一个指针变量pre指向头结点,cur指向头结点的下一个,开始遍历,遍历的过程中删除/*...原创 2019-10-26 12:01:39 · 72 阅读 · 0 评论 -
《剑指offer》合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路:1.先定义一个头结点2.定义一个辅助变量指向头结点3.如果list.val小于list2.val,则辅助变量的next先指向list1,否则相反4.最后记得,有个节点没有处理/*public class ListNode { int val; Li...原创 2019-10-20 20:27:26 · 71 阅读 · 0 评论 -
《剑指offer》反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。思路:1. 定义一个新的头结点,然后使用头插法进行。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class So...原创 2019-10-19 17:23:16 · 76 阅读 · 0 评论 -
《剑指offer》链表中倒数第k个节点
题目描述输入一个链表,输出该链表中倒数第k个结点。思路:1. 先计算出该链表的长度2. 使用辅助指针指向第一个节点,遍历长度-k次就是倒数第k个节点。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val;...原创 2019-10-19 17:20:08 · 61 阅读 · 0 评论