剑指offer
LuckyAsYou
后端研发
展开
-
剑指offer45--把数组排成最小的数
题目描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印 能拼接出的所有数字中最小的一个思路:先将整型数组转换成String数组,然后将String数组排序,最后将排好序 的字符串数组拼接出来。关键就是制定排序规则。或使用比较和快排的思想,将前 面的数和最后的数比较,若小则放到最前面,最后再递归调用。在这里插入代码片...原创 2020-03-09 23:20:39 · 126 阅读 · 0 评论 -
剑指offer44---数字序列中某一位的数字
题目描述数字以01234567891011121314…的格式序列化到一个字符序列中。在这个序列中,第5位是5(从0开始),第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。思路:1)找出n属于的数的长度是多少2)如果n属于长度为len+1的某个数,找出n属于第几个长度为len+1的数3)找出n是那个数的第几位package Function;public cla...原创 2020-03-09 23:11:07 · 129 阅读 · 0 评论 -
剑指offer--从 1 到非负整数 n 中 1 出现的次数
题目描述:输入一个整数n,求从1到整数n的十进制表示中1出现的次数思路:若百位上数字为0,百位上可能出现1的次数由更高位决定;若百位上数字 为1,百位上可能出现1的次数不仅受更高位影响还受低位影响;若百位上数字大 于1,则百位上出现1的情况仅由更高位决定package Function;//a+8的巧妙之处在于当a的最后一位(当前分析位)为0或1时,加8不产生进位,这是为需要单独算的特殊情况...原创 2020-03-09 23:05:57 · 163 阅读 · 0 评论 -
剑指offer---连续子数组的最大和
题目描述:输入一个整型数组,数组中有正数也有负数,数组中一个或连续的多 个整数组成一个子数组,求连续子数组的最大和思路:若和小于0,则将最大和置为当前值,否则计算最大和。package Function;//解法二:使用动态规划://F(i):以array[i]为末尾元素的子数组的和的最大值,子数组的元素的相对位置不变//F(i)=max(F(i-1)+array[i] , array[...原创 2020-03-09 23:04:18 · 100 阅读 · 0 评论 -
剑指offer--数据流中的中位数
题目描述:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值, 那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数 值,那么中位数就是所有数值排序之后中间两个数的平均值。思路:创建优先级队列维护大顶堆和小顶堆两个堆,并且小顶堆的值都大于大顶 堆的值,2个堆个数的差值小于等于1,所以当插入个数为奇数时:大顶堆个数就 比小顶堆多1,中位数就是大顶堆堆头;当插入个数为偶数...原创 2020-03-09 23:02:29 · 99 阅读 · 0 评论 -
剑指offer--最小的k个数
题目描述:输入n个整数,找出其中最小的K个数。思路:先将前K个数放入数组,进行堆排序,若之后的数比它还小,则进行调整//以最大堆来实现,适合海量数据//最大堆中,根节点的值总是大于它的子树中任意节点的值//先将前K个数放入数组,进行堆排序,// 若之后的数比它还小,则进行调整package Function;import java.util.ArrayList;import jav...原创 2020-03-09 23:01:00 · 127 阅读 · 0 评论 -
剑指offer39--.数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数 字。如果不存在则输出0。思路:将首次出现的数count+1,与之后的数进行比较,相等则+1,否则—1,最 后进行校验是否超过长度的一半。//:将首次出现的数count+1,与之后的数进行比较,// 相等则+1,否则—1,// 最后进行校验是否超过长度的一半。package Function;public class ...原创 2020-03-09 22:59:18 · 92 阅读 · 0 评论 -
剑指offer---打印出字符串的所有排列
题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输 入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab 和cba。思路:将当前位置的字符和前一个字符位置交换,递归。//算法描述:我们求整个字符串的排列,可以看成两步:// 1.求得所有可能出现在第一个位置的字符,即把第一个字符和后面的所有字符交换。*// 2.固定第一...原创 2020-03-09 22:57:32 · 138 阅读 · 0 评论 -
剑指offer37--序列二叉树
题目描述:请实现两个函数,分别用来序列化和反序列化二叉树思路:序列化:前序遍历二叉树存入字符串中;反序列化:根据前序遍历重建二 叉树。//序列化:前序遍历二叉树存入字符串中;反序列化:根据前序遍历重建二 叉树。//二叉树的序列化是指:// 把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,// 从而使得内存中建立起来的二叉树可以持久保存。// 序列化可以基于先序、中序、后序、层...原创 2020-03-09 22:55:30 · 93 阅读 · 0 评论 -
剑指offer36--二叉搜索树转换为双向链表
题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:定义一个链表的尾节点,递归处理左右子树,最后返回链表的头节点//中序遍历即为从小到大排序/*中序遍历:把一棵二叉排序树看成三个部分,根节点,右子树,左子树, 根节点的左指针指向左子树的形成链表的最后一个节点, 根节点的右孩子指向右...原创 2020-03-09 22:53:05 · 162 阅读 · 0 评论 -
剑指offer35---复杂链表的复制
题目描述:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向 下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的 head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接 返回空)思路:先复制链表的next节点,将复制后的节点接在原节点后,然后复制其它的 节点,最后取偶数位置的节点(复制后的节点)。package Function;/** ...原创 2020-03-09 22:50:50 · 102 阅读 · 1 评论 -
剑指offer34--二叉树中和为某值的路径
题目描述:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数 的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一 条路径。思路:先保存根节点,然后分别递归在左右子树中找目标值,若找到即到达叶子 节点,打印路径中的值package Function;//先保存根节点,然后分别递归在左右子树中找目标值,// 若找到即到达叶子 节点,打印路径中的值//递归调用...原创 2020-03-09 22:49:24 · 64 阅读 · 0 评论 -
剑指offer33---后序遍历二叉搜索树
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结 果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相 同。思路:先找到右子树的开始位置,然后分别进行左右子树递归处理package Function;import java.util.Arrays;//先找到右子树的开始位置,然后分别进行左右子树递归处理。//后序遍历中最后一个数字为根节点//...原创 2020-03-09 22:47:24 · 81 阅读 · 0 评论 -
剑指offer32--打印二叉树
题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一 行。思路:利用辅助空间链表或队列来存储节点,每层输出。package Function;import Test.TreeNode;import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;public clas...原创 2020-03-09 22:45:19 · 123 阅读 · 0 评论 -
剑指offer31判断一个栈是否是另一个栈的弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序 列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5 是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但 4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等 的)思路:用栈来压入弹出元素,相等则出栈。package Function;//:...原创 2020-03-09 22:41:46 · 108 阅读 · 0 评论 -
剑指offer---包含 main 函数的栈
题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min 函数。思路:定义两个栈,一个存放入的值。另一个存最小值。package Function;import java.util.Stack;public class Stack30 { Stack<Integer> stack1=new Stack(); Stack<Integer&g...原创 2020-03-03 18:12:38 · 163 阅读 · 0 评论 -
剑指offer---顺时针打印矩阵
题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数 字,例如,如果输入如下4X4矩阵:12345678910111213141516则依次 打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路:按层模拟:终止行号大于起始行号,终止列号大于起始列号。package Function;import java.util.ArrayList;...原创 2020-03-03 18:10:43 · 91 阅读 · 0 评论 -
剑指offer---对称的二叉树
题目描述:请实现一个函数,用来判断一颗二叉树是不是对称的。注意:如果一 个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:利用递归进行判断,若左子树的左孩子等于右子树的右孩子且左子树的右 孩子等于右子树的左孩子,并且左右子树节点的值相等,则是对称的。package Function;import Test.TreeNode;public class isSymmetrical28 {...原创 2020-03-03 18:08:19 · 97 阅读 · 0 评论 -
剑指offer--二叉树的镜像
//二叉树的镜像//首根节点相同,左右子树调换了位置package Function;import Test.TreeNode;import java.util.LinkedList;import java.util.Queue;import java.util.Stack;public class MirrorTreeNode27 { public static T...原创 2020-03-03 18:06:46 · 91 阅读 · 0 评论 -
剑指offer---树的子结构
题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空 树不是任意一个树的子结构)思路:若根节点相等,利用递归比较他们的子树是否相等,若根节点不相等,则 利用递归分别在左右子树中查找。package Function;import Test.TreeNode;public class hasSubTree26 { public boolean hasSubTre...原创 2020-03-03 18:02:10 · 73 阅读 · 0 评论 -
剑指offer---合并两个有序链表
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需 要合成后的链表满足单调不减规则。思路:递归与非递归求解,小数放在前面。//合并两个排序的链表//迭代,时间复杂度:O(m+n),空间复杂度:O(1)package Function;import Test.ListNode;public class mergeTwoLists25 { public List...原创 2020-03-03 18:00:16 · 150 阅读 · 0 评论 -
剑指offer---反转链表
题目描述:输入一个链表,反转链表后,输出新链表的表头。思路:定义两个指针,反向输出package Function;//迭代:两个指针,反向输出,时间复杂度:O(n),空间复杂度:O(1)import Test.ListNode;public class reverseList24 { public ListNode reverseList(ListNode head) { ...原创 2020-03-03 17:51:58 · 78 阅读 · 0 评论 -
剑指offer---.链表中环的入口节点
题目描述:一个链表中包含环,请找出该链表的环的入口结点。步骤:第一步:确定一个链表中是否包含环。快慢指针(一个指针走一步,另一个指针走两步,快指针追上慢指针说明有环)第二步:如何找到环的入口(快慢相遇后,将其中一指针指向头结点,再以相同速度走,再次相遇即环的入口)思路:定义快慢两个指针,相遇后(环中相汇点)将快指针指向pHead然后一起 走,每次往后挪一位,相遇的节点即为所求。详细分析:相...原创 2020-03-03 17:21:53 · 125 阅读 · 0 评论 -
剑指offer---求链表中倒数第 K 个节点
题目描述:输入一个链表,输出该链表中倒数第k个结点。思路:定义一快一慢两个指针,快指针走K步,然后慢指针开始走,快指针到尾 时,慢指针就找到了倒数第K个节点。package Function;import Test.ListNode;public class findKthToTail22 { public static ListNode getReciprocalK(ListNo...原创 2020-03-03 17:02:43 · 105 阅读 · 0 评论 -
剑指offer---调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。思路:定义头尾两个指针,利用while条件循环判断,将奇数与偶数交换。package Function;public class ReorderOddEven21 { public static int[] reorderOddEven(int[] array...原创 2020-03-03 16:55:49 · 79 阅读 · 0 评论 -
剑指offer---正则表达式匹配
题目描述:请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表 示任意一个字符, 而表示它前面的字符可以出现任意次(包含0次)思路:当字符串只有一个字符时,进行判断,否则就有两种递归情况,(1)当模 式中的第二个字符不是“”时:如果字符串第一个字符和模式中的第一个字符相匹 配或是点那么字符串和模式都后移一个字符,然后匹配剩余的;如果 字符串第一 个字符和模式中的第一个字符相不...原创 2020-03-01 21:59:01 · 101 阅读 · 0 评论 -
剑指offer---删除链表中重复的节点&&O(1)时间删除链表节点
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结 点,重复的结点不保留,返回链表头指针。思路:先新建一个头节点,然后向后查找值相同的节点,重复查找后删除package Function;//删除链表中重复的节点//先新建一个头节点,然后向后查找值相同的节点,重复查找后删除import Test.ListNode;public class deleteDuplicat...原创 2020-03-01 21:53:40 · 114 阅读 · 0 评论 -
剑指offer---求 1 到最大的 n 位数
题目描述:输入数字n,按顺序打印从1到最大的n位数十进制数,比如:输入 3,打印出1到999.思路:考虑大数问题,使用字符串或数组表示package Function;//打印从1到最大的n位数// 思路:考虑大数问题,使用字符串或数组表示。public class printToMaxOfNDigits17 { public void printToMaxOfNDigits(i...原创 2020-03-01 21:51:59 · 197 阅读 · 0 评论 -
剑指offer---数值的整数次方
题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求 base的exponent次方。不得使用库函数,不需要考虑大数问题思路:不能用==比较两个浮点数是否相等,因为有误差。考虑输入值的多种情 况。package Function;public class Power16 { public double Power(double base, int ...原创 2020-03-01 21:50:15 · 83 阅读 · 0 评论 -
剑指0ffer--二进制中1的个数
**题目描述**:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表 示。 **思路**:a&(a-1)的结果会将a最右边的1变为0,直到a=0,还可以先将a&1!= 0,然后右移1位,但不能计算负数的值。```java//二进制中 1 的个数// 输入一个整数,输出该数二进制表示中1的个数。// 其中负数用补码表示。package Function;pu...原创 2020-03-01 21:48:26 · 108 阅读 · 0 评论 -
剑指offer--剪绳子
题目描述:给你一根长度为n的绳子,请把绳子剪成m段(m,n均为正数且均大于1)每段绳子的长度之间乘积,最大乘积为多少?思路:动态规划//剪绳子,求最大乘机 8=2+3+3(2*3*3=18)package Function;//products[0]=0,products[1]=1,products[2]=2,products[3]=3,//我的理解是,当length=4时,那么prod...原创 2020-03-01 21:37:24 · 91 阅读 · 0 评论 -
剑指offer--机器人的运动范围
题目描述:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移 动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐 标的数位之和大于k的格子。请问该机器人能够达到多少个格子?思路:利用递归实现,每次只能走上下左右四个点,进行判断点的位置是否越 界,点数之和是否大于K,是否已经走过了。//机器人的运动范围package Function;//(35,37)3+...原创 2020-03-01 21:33:28 · 111 阅读 · 0 评论 -
剑指offer---矩阵中的路径
题目描述:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串 所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向 左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子, 则该路径不能再进入该格子。思路:回溯法,双层for循环,判断每一个点,每次递归调用上下左右四个点,用 flag标志是否已经匹配(return),进行判断点的位置是否越界,是否已经...原创 2020-03-01 21:31:36 · 128 阅读 · 0 评论 -
剑指offer--- 斐波那契数列的应用&&青蛙跳台阶(1 或 2 级)
题目描述:现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39思路:递归的效率低,使用循环方式。package Function;//f(n)={0(n=0),1(n=1),f(n-1)+f(n-2)(n>1)}//递归public class fibonacci10 { public long fibonacci(int n) { lon...原创 2020-03-01 21:25:23 · 116 阅读 · 0 评论 -
剑指offer---用两个栈实现队列
题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的 元素为int类型。思路:一个栈压入元素,而另一个栈作为缓冲,将栈1的元素出栈后压入栈2 中。也可以将栈1中的最后一个元素直接出栈,而不用压入栈2中再出栈。package Function;import java.util.Stack;public class StackToQueue09 { Stack&...原创 2020-03-01 21:21:37 · 80 阅读 · 0 评论 -
剑指offer---二叉树的下一个节点
题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结 点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指 针。思路:若节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指 向左子结点的指针找到的叶子节点即为下一个节点;若节点不是根节点。如果该节 点是其父节点的左孩子,则返回父节点;否则继续向上遍历其父节点的父节点,重 复之前的判断,返回结果。二叉...原创 2020-03-01 21:18:32 · 192 阅读 · 0 评论 -
剑指offer---由前序和中序遍历重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假 设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:先找出根节点(前序数组第一个值),然后利用递归方法构造二叉树 ,中序根节点左右为左右子树。package Function;import ...原创 2020-03-01 21:01:34 · 115 阅读 · 0 评论 -
剑指offer---从尾到头打印链表
题目描述:输入一个链表,从尾到头打印链表每个节点的值。思路:借助栈实现,或使用递归的方法。定义链表结构package Test;//结点 链表public class ListNode { public int val; //下一个节点 a.next=b(next指向b)必须赋值 public ListNode next; //结点存的值 publ...原创 2020-03-01 20:58:52 · 117 阅读 · 0 评论 -
剑指offer---替换字符串中的空格
题目描述:将一个字符串中的空格替换成“%20”。例如:当字符串为WeAre Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:从后往前复制,数组长度会增加,或使用StringBuilder、StringBuffer类package Function;public class ReplaceSpace05 { public String ReplaceSpac...原创 2020-03-01 20:54:22 · 166 阅读 · 0 评论 -
剑指offer----二维数组查找目标值
题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列 都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一 个整数,判断数组中是否含有该整数。思路:从右上角或左下角开始找,逐行排除,或者用二分法查找本文采用左下方法0(m+n)package Function;//o(m+n) 0(1)public class Find04 { public ...原创 2020-03-01 20:51:33 · 365 阅读 · 0 评论