数据结构与算法
要开始刷题啦,记录相关算法,加深印象。
一路繁花相送
笑对一切困难险阻,用心生活。
展开
-
剑指offer试题编程练习44(java) 删除链表中重复的结点
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路:首先明确该链表是一个排序链表,也就是说若出现重复的结点,则这些结点在链表中必定相邻;还需要明确的一点是只要出现重复的结点,则相同的结点都删除;该题我觉得最主要的问题...原创 2020-04-22 14:53:13 · 102 阅读 · 0 评论 -
剑指offer试题编程练习43(java) 从二叉搜索树中查找出第k小的结点
题目:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路:已知该树为一棵二叉搜索树,二叉搜索树的左节点值<根节点值<右结点值,题目中要找到第三小的结点,则可采用中序遍历的方式对该二叉树进行遍历,当查找到第k个结点时返回。注意k值不能小于等于0.import java.util.List;...原创 2020-04-20 20:29:32 · 155 阅读 · 0 评论 -
剑指offer试题编程练习42(java) 按层打印二叉树(广度优先遍历二叉树)
题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:利用队列数据结构来存储结点,每次存入一层的结点。import java.util.ArrayList;import java.util.Queue;import java.util.LinkedList;/*public class TreeNode { int val = 0; Tree...原创 2020-04-18 15:42:04 · 136 阅读 · 0 评论 -
剑指offer试题编程练习41(java) 按之字形打印二叉树
题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路: 该问题为一个广度优先遍历问题,按题意所说,在遍历时要分奇数层和偶数层,利用队列数据结构来保存二叉树结点,通过对奇偶层的判断来决定元素是从列表的后面插入还是前面插入。import java.util.ArrayList;import...原创 2020-04-18 14:28:27 · 95 阅读 · 0 评论 -
剑指offer试题编程练习40(java) 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。import java.util.ArrayList;public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { ...原创 2020-04-13 20:15:21 · 206 阅读 · 0 评论 -
剑指offer试题编程练习39(java) 输出所有和为S的连续正数序列
输出所有和为S的连续正数序列(至少包含两个数)。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序。思路:利用穷举法的思想。根据条件“至少包含两个数”,可以确定得到的序列中最大值可达到S/2+1,首先将第一个元素加入结果序列,S=S-i;依次往后找j=i+1,判断S-j的大小,若大于0则加入结果序列;若等于零将结果序列加入返回序列,退出内层循环,i++,重复上述操作;若小于零,退出内层...原创 2020-04-13 15:14:33 · 85 阅读 · 0 评论 -
剑指offer试题编程练习38(java) 判断一棵二叉树是否是对称的
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:根据https://blog.csdn.net/Ferlan/article/details/82975543/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode...原创 2020-04-12 13:21:24 · 126 阅读 · 0 评论 -
剑指offer试题编程练习37(java) 根据二叉树中序遍历查找某个结点的下个结点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:首先要搞清楚二叉树的中序遍历顺序为左子树->根节点->右子树。接下来要考虑该结点的位置,若该结点有右子树则查找右子树的最后一个左节点,若无左节点则返回该右结点;若该结点无右子树则查找其父节点,若该结点为父节点的左子树则返回该父结点,否则继续往上...原创 2020-04-11 18:39:12 · 150 阅读 · 0 评论 -
剑指offer试题编程练习36(java) 找出数组中只出现一次的数字
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:利用Map数据结构来进行处理,熟悉Map数据结构怎么存取数据。//num1,num2分别为长度为1的数组。传出参数//将num1[0],num2[0]设置为返回结果import java.util.Map;import java.util.HashMap;public class S...原创 2020-04-11 15:41:30 · 124 阅读 · 0 评论 -
剑指offer试题编程练习35(java) 判断是否为平衡二叉树
输入一棵二叉树,判断该二叉树是否是平衡二叉树。根据上篇求树的深度,判断左右子树的深度之差,若大于1则不是平衡二叉树。平衡二叉树相关内容参考:https://baijiahao.baidu.com/s?id=1651427207567199156&wfr=spider&for=pcpublic class Solution { boolean isBalance...原创 2020-04-10 21:47:44 · 80 阅读 · 0 评论 -
剑指offer试题编程练习34(java) 求二叉树的深度
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。采用递归的方法进行解决/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int v...原创 2020-04-10 11:44:17 · 88 阅读 · 0 评论 -
剑指offer试题编程练习33(java) 寻找两个链表的公共节点
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)思路:两个链表的公共节点,因为每个节点只有一个next,所以如果两个链表有公共节点的话,那么从该公共节点开始后面的所有节点相同,则可通过得到两个链表的长度,找到长链表与短链表长度相同的一个起点,逐一与短链表的节点进行比较。/*public class Lis...原创 2020-04-09 20:05:25 · 114 阅读 · 0 评论 -
剑指offer试题编程练习32(java) 查找字符串中第一个只出现一次的字符
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).思路:把字符串转换为字符数组,利用Map数据结构,将字符作为Key,字符出现的次数作为Value,依次将字符存入Map结构中。import java.util.HashMap;import java.util.Map;pub...原创 2020-04-08 21:37:18 · 106 阅读 · 0 评论 -
剑指offer试题编程练习31(java) 统计一组数中1的个数
31、求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。思路:利用当前数除10来得到该数中1的个数...public clas...原创 2020-04-06 16:33:02 · 121 阅读 · 0 评论 -
剑指offer试题编程练习30(java) 数组子序列最大和
30、HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和...原创 2020-04-06 16:13:54 · 65 阅读 · 0 评论 -
剑指offer试题编程练习29(java) 找出数组中最小的K个数
29、输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路:只对数组中的前K个数进行排序,可采用冒泡排序的方法,若K值大于数组的长度,返回空。import java.util.ArrayList;public class Solution { public ArrayList<Integer>...原创 2020-04-05 15:52:10 · 121 阅读 · 0 评论 -
剑指offer试题编程练习28(java) 数组元素计数
28、数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路:首先想到的计数方法是使用Map数据结构来进行计数,Key保存数组中的元素,Value保存该元素在数组中出现的次数。//该题为给数组中的元素计数的问题,首先让我想到的是M...原创 2020-04-05 15:14:28 · 122 阅读 · 0 评论 -
剑指offer试题编程练习27(java) 字符串的排列组合
27、输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。未完 待解决!!!...原创 2020-04-04 15:47:13 · 82 阅读 · 0 评论 -
剑指offer试题编程练习26(java) 二叉搜索树转换成一个排序的双向链表
26、输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:一颗二叉搜索树的中序遍历为一个递增的序列......明天再来.......原创 2020-04-03 19:54:00 · 102 阅读 · 0 评论 -
剑指offer试题编程练习25(java) 复杂链表的复制
25、输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解法来自:https://blog.csdn.net/qq_41901915/article/details/90286802/*public class Rand...原创 2020-04-03 19:30:26 · 74 阅读 · 0 评论 -
剑指offer试题编程练习24(java) 二叉树路径查找
24、输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)分析:这题相当于对二叉树进行深度优先遍历,其中还存在剪枝操作。....待会来解决...原创 2020-04-01 15:52:58 · 266 阅读 · 0 评论 -
剑指offer试题编程练习23(java) 二叉查找树(二叉搜索树)
23、输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。首先我们要明确二叉搜索树它是怎么样的一个结构二叉搜索树中根节点的值大于其左子树中任意一个节点的值,小于其右节点中任意一节点的值,这一规则适用于二叉搜索树中的每一个节点。(来自网友https://blog.csdn.net/rodman177/art...原创 2020-04-01 14:51:58 · 118 阅读 · 0 评论 -
剑指offer试题编程练习22(java) 二叉树广度优先遍历
22、从上往下打印出二叉树的每个节点,同层节点从左至右打印。分析:该题属于二叉树的遍历,广度优先遍历思路:借助一个数列按照广度优先遍历顺序依次存放二叉树中的节点,每次弹出第一个节点,存放该节点的值到数组中。import java.util.ArrayList;import java.util.Queue;/**public class TreeNode { int va...原创 2020-03-31 20:34:32 · 233 阅读 · 0 评论 -
剑指offer试题编程练习21(java) 判断某序列是否可能为某栈的弹出序列
21、输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路1: 利用栈的特点来进行解题,栈是一种后进先出的数据结构。首先找出弹出序列中的第一个...原创 2020-03-31 12:33:01 · 106 阅读 · 0 评论 -
剑指offer试题编程练习20(java) 实现取栈中最小元素的函数
20、定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。import java.util.Stack;public class Solution { //借助辅助栈来解决问题 Stack<Integer> stac...原创 2020-03-30 21:45:26 · 130 阅读 · 0 评论 -
剑指offer试题编程练习19(java) 顺时针打印矩阵中的元素
19、输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.4*4的矩阵为:1 2 3 45 6 7 89 10 11 1213 14 1...原创 2020-03-28 20:21:54 · 251 阅读 · 0 评论 -
剑指offer试题编程练习18(java) 二叉树的镜像
18、操作给定的二叉树,将其变换为源二叉树的镜像。思路:将二叉树转换为其镜像,可以看出就是将各个节点的左子树和右子树进行交换,可利用递归的方法进行实现,当前节点不为null时,将其左子树和右子树进行交换。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right =...原创 2020-03-27 19:18:06 · 58 阅读 · 0 评论 -
剑指offer试题编程练习17(java) 判断是否为某二叉树的子结构
17、输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)首先我们要了解二叉树的子结构概念,不要和子树的概念弄混淆。思路:首先是对二叉树A进行遍历,找到找到与二叉树B的根节点相同的节点,若找不到与二叉树根节点相同的节点则返回false,若找到与其相同的根节点后再往下判断其左右节点是否相同,若其中出现不相同的节点返回false,若二叉树A先遍历完返回...原创 2020-03-27 15:28:08 · 85 阅读 · 0 评论 -
剑指offer试题编程练习16(java) 合并排好序的两个链表
16、输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。非递归的方法:注意头结点,以及链表为空的情况/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }...原创 2020-03-26 19:43:35 · 79 阅读 · 0 评论 -
剑指offer试题编程练习15(java) 反转链表
15、输入一个链表,反转链表后,输出新链表的表头。关于链表反转的方法,主要有递归法和循环法。循环法:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solut...原创 2020-03-26 12:33:42 · 44 阅读 · 0 评论 -
剑指offer试题编程练习14(java) 获取链表某个结点
14、输入一个链表,输出该链表中倒数第k个结点。思路:先计算出链表的长度l,倒数第k个结点即表示顺数第l-k+1个结点。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public cla...原创 2020-03-24 11:48:50 · 117 阅读 · 0 评论 -
剑指offer试题编程练习13(java) 数组内部排序
13、输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。该题属于数组的内部排序,要保持奇数之间的相对位置,偶数之间的相对位置保持不变,那可以考虑相邻之间的元素进行交换,那我们可以想到冒泡排序的思路,当偶数在前奇数在后时进行交换。public class Solution ...原创 2020-03-24 10:49:51 · 68 阅读 · 0 评论 -
剑指offer试题编程练习12(java) 移位运算符
12、给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0解法来自:https://blog.csdn.net/weixin_42967016/article/details/85083307核心要点:1、<<:左移运算符,num<<1,相当于num乘以2;...原创 2020-03-22 15:30:07 · 210 阅读 · 1 评论 -
剑指offer试题编程练习11(java) 位运算符的运用
11、输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。首先回顾原码、反码、补码的知识(来自https://www.jianshu.com/p/36ec7a047f29) 在计算机底层均是以二进制表示的,数字也不例外,下面以8位bit的值为例原码最高位为符号位,0代表正数,1代表负数,非符号位为该数字绝对值的二进制表示。如: 127 的原码为0111 ...原创 2020-03-22 11:58:05 · 155 阅读 · 1 评论 -
剑指offer试题编程练习9-10(java) 列等式找规律
9、一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。首先还是来找找规律......n=1,f(1)=1n=2,f(2)=2n=3,f(3)=f(3-1)+f(3-2)+f(3-3),该等式表示要跳上3级台阶最后一跳有三种跳法,最后一跳可以是1或2或3...n-1,f(n-1)=f(n-1-1)+f(n-1-2)+...原创 2020-03-21 16:11:23 · 130 阅读 · 0 评论 -
剑指offer试题编程练习7-8(java)斐波那契数列&其变形问题(分解问题思想)
7、斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39斐波那契数列:1,1,2,3,5,8,13...除了第一项和第二项,后面的项为前面一项和前前项的和。f(n)=f(n-1)+f(n-2)。public class Solution { public int Fibonacci(int n) { in...原创 2020-03-21 12:24:48 · 162 阅读 · 0 评论 -
剑指offer试题编程练习5-6(java) 栈操作
5、用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。首先我们要明确栈和队列是如何存取数据的:栈是一种先进后出的数据结构,队列是一种先进先出的数据结构。利用两个栈来实现一个队列的Push和Pop操作,设两个栈分别为stack1,stack2,我们可以利用一个栈来存数据,另一个栈来取数据,Push操作时,Push到stack1中;Pop操作时,将stac...原创 2020-03-19 10:27:44 · 105 阅读 · 0 评论 -
剑指offer试题编程练习3-4(java) 链表反序输出&重建二叉树
明天加油....原创 2020-03-11 20:17:15 · 113 阅读 · 0 评论 -
剑指offer试题编程练习1-2(java) 二维数组&字符串数组
1.在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路:找一个二维数组中中间大小的值与输入的目标值进行比较,通过比较大小移动二维数组的索引,选取的是右上角的元素作为比较的对象。public class Solution { ...原创 2020-03-11 18:47:38 · 144 阅读 · 0 评论