
剑指Offer
安然就好
这个作者很懒,什么都没留下…
展开
-
从上往下打印二叉树(Java)
牛客链接从上往下打印二叉树题目从上往下打印出二叉树的每个节点,同层节点从左至右打印。解题思路用队列queue实现。list用来保存遍历的值,queue用来遍历层次遍历二叉树。先将root存入queue如果queue不为空,就将当前节点值存入list,并将此节点抛掉然后依次遍历左节点和右节点,若不为空,则说明有值,就将节点存入queue直到queue为空为止,list内的值就是所求代码实现import java.util.ArrayList;import java.util.Qu原创 2021-06-19 17:59:32 · 232 阅读 · 0 评论 -
栈的压入、弹出序列(Java)
牛客链接栈的压入、弹出序列题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路用辅助栈实现。将入栈的数组入栈后,判断出栈顺序的当前数字是否为入栈数组的当前数字,如果是则进行出栈,直到不是当前数字为止。将所有数字循环入栈后都进行了出栈判原创 2021-06-19 17:52:46 · 227 阅读 · 0 评论 -
数组中出现次数超过一半的数字(Java)
牛客链接数组中出现次数超过一半的数字题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。你可以假设数组是非空的,并且给定的数组总是存在多数元素。1<=数组长度<=50000解题思路方法一为排序,排序后取中间值即可(此数字大于数组长度的一半,若有则一定是排序后的中间值)。方法二为遍历,记录数字出现的次数,记录出现次数的最大值,和数组的长度一半原创 2021-06-10 21:11:32 · 703 阅读 · 0 评论 -
包含min函数的栈(Java)
牛客链接包含min函数的栈题目定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。解题思路两个栈,一个正常的存储栈,一个最小栈。最小栈存储时用传入的值和栈顶元素(最小值)进行比较,如果比栈顶元素小或者相等,则直接入最下栈,否则再次存一次栈顶元素(保持两个栈元素数量相同的同时保证最小栈的栈顶元素是最小值,这样pop的时候可以同时pop的同时保证最小栈的栈顶还是正常存储栈的最小值)代码实现import java.util.Stack;p原创 2021-06-10 21:02:47 · 241 阅读 · 0 评论 -
顺时针打印矩阵(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.解题思路记录上下左右的边界,按照顺时针每往list添加一行或一列元素,对应的边界进行变化,直到一个边界超过相对的另一个边界为止,返回list即可,代码实现import java.util.Arra原创 2021-06-09 22:43:18 · 1083 阅读 · 0 评论 -
二叉树的镜像(Java)
牛客链接二叉树的镜像题目操作给定的二叉树,将其变换为源二叉树的镜像。解题思路从上到下遍历二叉树,将二叉树的左右孩子节点交换即可。代码实现 public TreeNode Mirror (TreeNode pRoot) { // write code here if(pRoot == null) return null; TreeNode temp = pRoot.left; pRoot.left = pRoot.rig原创 2021-06-08 21:27:07 · 97 阅读 · 0 评论 -
树的子结构(Java)
牛客链接树的子结构题目输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解题思路什么是子结构?在看牛客时概念有些混乱,子树和子结构是不同的。子结构可以是原树的任意一个节点的结构相同即可(B树在A树种出现即可)。什么是子树呢?子树代表这棵二叉树必须是原树的本树或左子树或右子树(B树必须是A树的左子树,右子树,或者和A树相同)思路可以看到,本题是要求B树是A树的子结构而非子树,那么,只要B树存在于A中即可,需要遍历A全部节点,而不仅仅是根节点和根原创 2021-06-07 21:27:51 · 223 阅读 · 0 评论 -
合并两个排序的链表(Java)
牛客链接合并两个排序的链表题目输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路先比较list1和list2的头结点大小,先记录下来,这就是要返回的头结点。然后根据list1和list2各个节点的大小比较,谁小就让当前节点cur的next指向哪个节点,然后让cur向后移动继续去寻找下一个节点,循环结束即可。代码实现public class Solution { public ListNode Merge(ListNode lis原创 2021-06-06 20:37:22 · 154 阅读 · 0 评论 -
反转链表(Java)
牛客链接反转链表题目输入一个链表,反转链表后,输出新链表的表头。解题思路head为头结点,也是操作时的当前节点。pre记录当前节点的前一个节点但是如果直接将head指向pre,怎么指向后面的节点进行后面节点的反转呢?所以需要再定义一个记录当前节点的下一个节点的节点temp,这样让head指向pre后,就可以通过让pre到head的位置,head到记录的temp的位置,继续下一个点的反转了,直至当前节点head为空时,说明所有节点已经反转完了,返回反转后的头结点pre即可。代码实现p原创 2021-06-05 22:15:15 · 99 阅读 · 0 评论 -
链表中倒数第k个结点(Java)
牛客链接链表中倒数第k个结点题目输入一个链表,输出该链表中倒数第k个结点。如果该链表长度小于k,请返回空。解题思路用双指针即可,倒数第k个,其实就是正数n-k+1个。先让快指针走k步,然后slow从head出发,跟fast一步一步走,当fast走到尾(空节点)时,slow的位置正在n-k+1。代码实现import java.util.*;/* * public class ListNode { * int val; * ListNode next = null; *原创 2021-06-04 21:30:31 · 134 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
牛客链接调整数组顺序使奇数位于偶数前面题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路遍历两边数组,第一遍将奇数放入数组,第二遍将偶数放入数组即可。代码实现import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可原创 2021-06-03 22:10:29 · 88 阅读 · 0 评论 -
数值的整数次方(Java)
牛客链接数值的整数次方题目给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0。不得使用库函数,同时不需要考虑大数问题,也不用考虑小数点后面0的位数。解题思路分析所有情况进行输出。如果base == 0,那么直接返回0即可。如果exponent == 0,返回1。如果exponent < 0,base = 1/base,exponent = - exponent(底数变为正值,但结果原创 2021-06-02 21:26:38 · 420 阅读 · 0 评论 -
二进制中1的个数(Java)
牛客链接二进制中1的个数题目输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。解题思路如果一个数 -1 ,二进制中的表示为最右边的一个1变为0,后面的所有0变为1。例如12(1100)减去1,则变为11(1011),转变过程为:1100 -> 1000(先将最右边的1变为0) -> 1011(再将后面的0变为1)此时将当前的值,与减去1后的值按位与(1100&1011) 就得到了1000(相当于已经计算了一个1,让count++) 重复上述步骤 直原创 2021-06-01 18:18:59 · 421 阅读 · 0 评论 -
矩形覆盖(Java)
牛客链接矩形覆盖题目我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,从同一个方向看总共有多少种不同的方法?解题思路斐波那契借用牛客评论的图理解代码实现public class Solution { public int rectCover(int target) { if(target == 0) return 0; if(target == 1 || target == 2) {原创 2021-06-01 18:11:52 · 151 阅读 · 0 评论 -
变态跳台阶(Java)
牛客链接跳台阶扩展问题(变态跳台阶)题目一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路我们先分析一下题中的意思。如果有一层台阶,那么跳法有f(1) = 1 种如果有两层台阶,那么跳法有f(2) = f(2-1) +1 种如果有三层台阶,那么跳法有f(3) = f(3-1) + f(3-2) +1种如果有四层台阶,那么跳法有f(4) = f(4-1) + f(4-2) +f(4-3) +1种…如果有n-1层台阶,原创 2021-05-31 20:27:09 · 139 阅读 · 0 评论 -
青蛙跳台阶(Java)
牛客链接跳台阶题目一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解题思路有n层台阶。如果青蛙跳法为1阶跳法,那么剩下的n-1个台阶的跳法为f(n-1)如果青蛙跳法为2阶跳法,那么剩下的n-2个台阶的跳法为f(n-2)f(n) = f(n-1) + f(n-2) 递归即可。代码实现public class Solution { public int jumpFloor(int target) {原创 2021-05-31 20:09:01 · 139 阅读 · 0 评论 -
斐波那契数列(Java)
牛客链接斐波那契数列题目大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n≤39解题思路递归会超时,循环即可。代码实现public class Solution { public int Fibonacci(int n) { if(n==0) return 0; int s = 0; int m = 1; int result = m+s;原创 2021-05-31 20:05:56 · 182 阅读 · 0 评论 -
旋转数组的最小数字(Java)
牛客链接旋转数组的最小数字题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解题思路二分法。能用二分法是因为本题有明确的大小界限。旋转之前的数组是从小到大排序的。取最左边的值为left,取最右边的值为right,那么right一定小于left。(从最初的左边移到右边,肯定是比留在左边的数要小的)取中间值:mid = left + (right -原创 2021-05-31 19:02:45 · 195 阅读 · 0 评论 -
用两个栈实现队列(Java)
牛客链接用两个栈实现队列题目用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路栈stack1用来实现push操作,stack2空的前提下才能进行入栈,否则影响后续进出队列的顺序。栈stack2用来实现pop操作,将push进去的stack1内的元素存入stack2中,再进行出栈,就是队列的出列顺序。代码实现import java.util.Stack;public class Solution { Stack<Integer&原创 2021-05-30 22:03:17 · 853 阅读 · 0 评论 -
剑指Offer题解(Java持续更新)
题目二维数组中的查找替换空格从尾到头打印链表重建二叉树原创 2021-05-29 21:53:37 · 158 阅读 · 0 评论 -
重建二叉树(Java)
牛客链接重建二叉树题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路前序遍历的顺序:根节点,左节点,右节点。可知整棵树的根节点是前序序列的第一个值pre[0]中序遍历的顺序:左节点,根节点,右节点。那么就可以根据前序遍历得到的根节点,在中序序列中查找,左边即使左树,右边即使右树。递归分别构建左树原创 2021-05-29 21:50:25 · 310 阅读 · 0 评论 -
从尾到头打印链表(Java)
牛客链接从尾到头打印链表题目输入一个链表,按链表从尾到头的顺序返回一个ArrayList。解题思路递归,一直打印链表的next(下一个值),直到链表为null开始返回,将值val添加到list中。代码实现/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;*原创 2021-05-29 21:45:27 · 135 阅读 · 0 评论 -
替换空格(Java)
牛客链接替换空格题目请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思路思路一:Java中有直接替换字符串中固定字符串的函数replaceAll( ),调用即可。思路二:用split以空格分隔字符串存入字符串数组中,再拼接起来,每次拼接中多拼接%20即可。代码实现import java.util.*;public class Solution { pub原创 2021-05-29 21:41:46 · 449 阅读 · 0 评论 -
二维数组中的查找(Java)
牛客链接二维数组中的查找题目在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]给定 target = 7,返回 true。给定 target = 3,返回 false。解题思路从左下角开始对比,如果target比所在位置值大,则向右找,若targe原创 2021-05-29 21:22:54 · 312 阅读 · 1 评论