
剑指offer(Java实现)
!&?
这个作者很懒,什么都没留下…
展开
-
剑指offer
剑指offer03. 数组中重复的数字(1)题目描述(2)思路与解法04. 二维数组中的查找(1)题目描述(2)思路与解法05. 替换空格(1)题目描述(2)思路与解法日期记录(更新题号)2020年10月12日03. 数组中重复的数字04. 二维数组中的查找05. 替换空格03. 数组中重复的数字(1)题目描述找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字原创 2020-10-12 21:23:42 · 343 阅读 · 0 评论 -
对称的二叉树(Java实现)
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。解题思路最初的想法是考虑一个节点的两个子节点的值是否相等,但是如果树的深度>2,就会得到错误结果了。看书上的思路是这样的:考虑先序遍历,先遍历根节点,再左孩子,最后右孩子。如果是一个对称的二叉树,先遍历右孩子,再遍历左孩子得到的结果应该是一致的。利用递归的思想就可以解...原创 2019-03-14 22:25:34 · 405 阅读 · 0 评论 -
从上到下打印二叉树(Java实现)
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。解题思路层次遍历,用队列保存节点。注意Queue的初始化问题:Queue is abstract; 不能用 new Queue();代码实现import java.util.ArrayList;import java.util.Queue;import java.util.LinkedList;/**public c...原创 2019-03-14 22:45:18 · 1410 阅读 · 0 评论 -
链表中倒数第k个节点(Java实现)
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路我解决本题的思路是建立在只遍历一遍链表的基础之上的。定义两个指向头节点的指针,第一个指针走了k-1步之后,第二个指针开始走,直到第一个指针到达尾节点。因为两个指针之间的距离始终保持在k-1步,所以当第一个指针到达尾节点的时候,第二个指针正好到达倒数第k个节点。代码实现/*public class ListNode { ...原创 2019-03-11 10:48:35 · 1487 阅读 · 0 评论 -
链表中环的入口节点(Java实现)
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。解题思路第一步:判断链表中是否有环。设置连个指针同时指向头节点,一个指针每次走两步,一个指针每次走一步,如果存在环,则两个指针一定可以相遇,相遇的节点一定是环内的某一点。第二部:确定环中节点数目。从第一步中可以得到环中的一个节点,设置一个指针指向这个节点,遍历环一次,统计出有多少个节点。第三步:找出环的...原创 2019-03-11 12:16:47 · 1454 阅读 · 0 评论 -
合并两个排序的链表(Java实现)
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路先在两个头结点中选择出一个较小的作为新链表的头结点,被选的节点指向下一个节点。新头结点的下一个节点就是再次比较两个排序链表的头结点的大小,可以用递归。注意当输入为空链表的情况,输出的结果就是另一个链表。代码实现/*public class ListNode { int ...原创 2019-03-12 12:15:17 · 1972 阅读 · 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.解题思路自己动手画几个例子,可以看出可以把问题划分为每次打印一个圈,每个圈的起始坐标为[0,0],[1,1],[2,...原创 2019-03-12 15:50:16 · 1121 阅读 · 0 评论 -
包含min函数的栈(Java实现)
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。解题思路设置两个栈,一个用来存放数据,一个用来存放当前的最小值。每次push一个数时,如果为空,则两个栈都push。如果非空,data栈push,min栈比较与栈顶元素的大小,push较小的那个进栈。example:push:4, 8, 3, 1data: 4, 8, 3...原创 2019-03-12 16:26:46 · 187 阅读 · 0 评论 -
树的子结构(Java实现)
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解题思路首先要找出A树的哪些节点和B树的根节点的值相等,这才有可能使得B称为A的一个子结构。之后再对与B树根节点值相等的子树判断每一个叶子节点的值是否相等。需要写两个函数,一个找出相等的节点,一个判断叶子节点是否相等。都是用递归实现的。代码实现/**public class Tree...原创 2019-03-17 21:28:58 · 765 阅读 · 0 评论 -
最小的k个数(Java实现)
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题思路设置一个大小为k的容器,如果还有空余,就将数组中的数加进去,否则就比较数组中的数和容器中最大的数,选择最小的放进去。注:ArrayList中的indexOf(int k)方法,是返回值为k的下标。代码实现import java.util.ArrayL...原创 2019-03-17 23:02:27 · 637 阅读 · 0 评论 -
圆圈中最后剩下的数(Java实现)
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一...原创 2019-03-24 22:52:40 · 457 阅读 · 0 评论 -
把二叉树打印成多行(Java实现)
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。解题思路层次遍历。注意Java中queue的初始化问题。代码实现import java.util.ArrayList;import java.util.Queue;import java.util.LinkedList;/*public class TreeNode { int val = 0; ...原创 2019-03-22 22:22:14 · 1022 阅读 · 0 评论 -
丑数(Java实现)
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解题思路(1)最开始考虑的是,将已知的丑数分别乘以2, 3,5,选择出最小的一个加入的ugly队列中。可以使用TreeSet集合,这样既能保证生成的丑数不会重复,而且保证了是从小到大排序的,每次从tr...原创 2019-03-26 19:47:03 · 2231 阅读 · 0 评论 -
二叉树的镜像(Java实现)
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树8/ \、6 10/ \ / \、5 7 9 11镜像二叉树8/ \、10 6/ \ / \、11 9 7 5解题思路递归的思想,交换两个子节点。代码实现:/**public class TreeNode { int val = 0; ...原创 2019-03-14 22:04:04 · 2612 阅读 · 0 评论 -
变态跳台阶(Java实现)
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路分析动手算出前几项结果,找规律1:1【1】2:1+1/2【2】3:1+1+1/2+1/1+2/3 【4】4:1+1+1+1/2+1+1/1+2+1/1+1+2/2+2/1+3/3+1/4 【8】…代码如下:public class...原创 2019-03-04 17:46:37 · 652 阅读 · 0 评论 -
替换空格(Java实现)
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。结题思路一新创建一个string对象,从后往前遍历,如果是空格,则添加“%20”,否则添加对应的字符。因为有足够的内存空间,所以这种方法下无论从先往后遍历还是从后往前遍历都是可以的。代码如下:public class Sol...原创 2019-02-28 10:54:25 · 3839 阅读 · 1 评论 -
从头到尾打印链表(Java实现)
从头到尾打印链表(Java实现)问题描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。解题思路利用栈“先入后出”的特性。代码实现:/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* ...原创 2019-03-02 09:01:28 · 4050 阅读 · 0 评论 -
反转链表(Java实现)
题目描述输入一个链表,反转链表后,输出新链表的表头。解题思路当对一个节点的next指针进行反转时,会造成链表的断裂,需要保存当前节点的next节点。代码实现:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; ...原创 2019-03-02 09:31:24 · 531 阅读 · 1 评论 -
旋转数组的最小数字(Java实现)
问题描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解题思路将数组旋转之后,可以看做把原来的数组分成了两个不递减数组,{3, 4,5}和{1, 2},而最小的数“...原创 2019-03-05 18:10:42 · 164 阅读 · 0 评论 -
重建二叉树(Java实现)
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路前序遍历的一个结果是根节点。这样可以根据中序遍历中根节点的位置将二叉树分成两个字树(左子树、右子树),利用递归的思想可以解决这个问题。实现代...原创 2019-03-03 10:20:13 · 3414 阅读 · 1 评论 -
二叉树的下一个结点(Java实现)
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。解题思路见注释代码实现:/*public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; Tre...原创 2019-03-03 10:55:17 · 356 阅读 · 0 评论 -
数组中出现次数超过一半的数(Java实现)
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路数组中有一个数组出现的次数超过一半,这意味它出现的次数比其他所有数字出现的次数之和还要大。因此我们可以在遍历数组的时候保存两个值,一个是当前数字,一个是这个数字出现的次...原创 2019-03-08 17:46:36 · 1347 阅读 · 0 评论 -
二进制中1的个数(Java实现)
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解题思路首先要熟悉二进制的位运算:&是与操作,|是或操作,^是异或操作,<<是左移,>>是右移如果是一个有符号数,右移操作时,用符号位填补最左边的数字。这道题问1的个数,考虑到只有1&1=1,所以可以将每一位与1做与操作,得到结果为1则表示该位位1 。这里需要考虑是将整数右...原创 2019-03-08 19:07:43 · 3057 阅读 · 0 评论 -
用两个栈实现队列(Java实现)
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路两个栈stack1和stack2 。开始时,每次添加队尾元素到stack1中。如果需要弹出队头元素,则将stack1中的元素弹出并push到stack2中,再将stack2的栈顶元素弹出,即为弹出了队头元素。如果stack2中是非空的,再在队尾中添加元素的时候仍然加到stack1中,从s...原创 2019-03-04 10:39:57 · 8137 阅读 · 2 评论 -
斐波那契数列(Java实现)
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39解题思路一:用递归的方法。代码如下:public class Solution { public int Fibonacci(int n) { if(n == 0) { return 0; } ...原创 2019-03-04 17:22:45 · 47393 阅读 · 4 评论 -
跳台阶(Java实现)
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解题思路斐波那契数列代码如下:public class Solution { public int JumpFloor(int target) { if(target == 1) { return 1; ...原创 2019-03-04 17:33:18 · 669 阅读 · 0 评论 -
矩形覆盖(Java实现)
题目描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路斐波那契数列代码如下:public class Solution { public int RectCover(int target) { if(target == 1) { return 1; ...原创 2019-03-04 17:36:33 · 240 阅读 · 0 评论 -
二维数组中的查找(Java实现)
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路首先选择数组中右上角的数字。如果该数字等于目标数字,则查找结束;如果该数字大于目标数字,则表明该列数字均大于目标数字,剔除该列;若该数字小鱼目标数字,则表明该行数字均小于目标数字,剔除该...原创 2019-02-28 08:57:13 · 1030 阅读 · 1 评论