算法
一些练习
zz070
这个作者很懒,什么都没留下…
展开
-
二叉树的深度
【题目描述】输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。【思路】(1)方法一:递归法一①递归退出条件:root == null,即到达最后一个子树②先循环遍历左子树,再循环遍历右子树③输出左右子树中深度大的(2)方法二:递归法二①定义一个成员变量max,用于记录最大层数②递归退出条件:root == null,即到达最后一个子树③在辅助函数中,若root == null,说明,该结点没有子树,此时将当前层数与记原创 2020-08-01 00:21:51 · 196 阅读 · 0 评论 -
连续子数组的最大和
【题目描述】HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的(子向量的长度至少是1)【思路】(1)方法一:动态规划①定义状态:f(i) :以i下标结尾的最大连续原创 2020-07-31 21:25:54 · 109 阅读 · 0 评论 -
从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路(1)利用队列先进先出的特点,层序遍历二叉树(2)详细步骤①若二叉树为空,直接返回一个空的ArrayList②定义一个队列用于存放准备排序二叉树结点,定义一个ArrayList用于存放一已排好序二叉树③将根节点入队④当二叉树非空的情况下,将队列中的元素放到ArrayList中,再判断该节点是否有左右子树,分别入队⑤最后返回list代码/**public class TreeNode { int val = 0原创 2020-07-31 20:23:38 · 109 阅读 · 0 评论 -
删除链表中的重复结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路(1)若链表为空或者只有一个结点,直接返回head(2)在链表不空的情况下,定义一个新链表用于存放去重后的结点,若head.next也不为空且head.val == head.next.val就向后移,直至相邻结点的值不相等;将不重复的值放到定义的新链表中即可代码/*原创 2020-07-31 19:29:56 · 245 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。思路(1)方法一:利用栈①根据栈先进后出的特点,将链表中的元素全部放入到栈中②创建一个ArrayList,将出栈的元素一次添加到ArrayList中③返回ArrayList(2)方法二:逆置数组①创建一个ArrayList,将链表中的所有元素添加到ArrayList中②将ArrayList逆置,这里用到了get()方法和set()方法 E get(int index) 获取下标为index的元素 E set(i原创 2020-07-30 15:57:08 · 83 阅读 · 0 评论 -
反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。思路代码/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode ReverseList(ListNode head) { if(head == null原创 2020-07-29 20:46:03 · 176 阅读 · 0 评论 -
翻转单词顺序列
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路(1)方法一:使用StringBuffer①用split()方法用空格将原字符串用空格拆分为字符串数组②若原字符串只有空格那么原创 2020-07-29 15:49:42 · 111 阅读 · 0 评论 -
左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。思路代码在这里插入代码片...原创 2020-07-29 11:24:54 · 98 阅读 · 0 评论 -
数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路(1)由于异或,相同为0不同为1的特点,利用异或的方式查找数组中两个只出现一次的数字(2)详细步骤①首先将所有数组中的所有元素进行异或,得到一个结果result;②利用result对数组分组,找到result第一个比特位为1的数,与其异或结果为1的为一组,为0的为一组③问题就转化为求一个整形数组中只有一个出现一次的数字,直接进行异或,最终得到的值就是出现一次的数字代码//num1,nu原创 2020-07-27 22:04:19 · 94 阅读 · 0 评论 -
链表第一个公共结点
题目要求输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)思路(1)要找公共结点,那么最后一定是一同到达链表末尾的,所以,先让长链表向后走step(step = |lengthA - lengthB|)步,再将两个链表的结点放在一起对比,返回第一个相同的结点即可(2)详细步骤①获取两个链表的长度②比较长的链表向后走step(step = |lengthA - lengthB|)步,此时两个链表长度相同③开始比较链表原创 2020-07-27 21:26:50 · 106 阅读 · 0 评论 -
回文数索引
题目描述给定一个仅由小写字母组成的字符串。现在请找出一个位置,删掉那个字母之后,字符串变成回文。请放心总会有一个合法的解。如果给定的字符串已经是一个回文串,那么输出-1。思路(1)根据题目要求可知,无论如何都会有一个合法的解从两侧进行统计,如果不同,则删除任意一个,在判定是否是回文,如果是,下标就是删除数据的下标,如果不是,就是另一个元素的下标代码import java.util.*; /* 输入描述: 第一行包含T,测试数据的组数。后面跟有T行,每行包含一个字符串。 输出描原创 2020-07-27 17:07:57 · 166 阅读 · 0 评论 -
最小栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))思路创建两个栈A,B,A用于存放用于存放正常数据,B用于存放A中的最小值 1、入栈 (1)将要入栈的数直接入到A中; (2)此时,若B为空,将该数再次入到B中; (3)若B不为空,则取B的栈顶元素,与该数进行比较,将较小的数入到B中 2、出栈 (1)若A为空,直接返回null (2)A不为空,A,B同原创 2020-07-24 11:48:47 · 87 阅读 · 0 评论 -
链表的倒数第K个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。思路(1)方法一:得到链表的结点个数size,让head向后走size-k步;①若链表为空,直接返回null②获取链表的结点个数size③若K值不合法(k<=0||k>size),直接返回null;④head向后走size-k步,返回此时的head即可(2)方法二:前后指针法①若链表为空,直接返回null②若K值不合法(k<=0),直接返回null;③定义两个指针front,rear④front先走K步⑤fron原创 2020-07-24 10:18:10 · 76 阅读 · 0 评论 -
树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路(1)B是A的子结构,即说明B是A的一部分(2)比较的过程主要分为:①确定起始位置;②从起始位置开始,判断后续左右子树是否相同(3)主要步骤:①根据题意可知,若两棵二叉树中任意一棵树为空,直接返回false;②此时说明二叉树A,B都非空,从根结点开始比较,若相同,进入isSameTree()比较剩下部分是否相同,若不同,接着从A树的左右结点分别开始比较③在isSameTree()函数中原创 2020-07-23 21:46:39 · 76 阅读 · 0 评论 -
镜像二叉树
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。思路(1)获取源二叉树的镜像,将源二叉树的左右子树交换即可(2)主要步骤:①若二叉树为空,直接返回;②若二叉树不为空,交换其左右子树③递归的将二叉树的其他结点进行交换;代码/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) {原创 2020-07-23 19:24:07 · 151 阅读 · 0 评论 -
合并链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则思路(1)根据题意,两个链表都是递增的,所以只需要从头到尾依次比较两个链表的元素,再按序放入新链表中即可(2)具体做法:①若其中一个个链表为空,直接返回另一个链表;②创建一个新链表newHead用于存放排序后的元素,由于,创建一个空链表,在加入新元素时,还要分情况讨论,所以直接创建一个非空结点,返回时,返回头结点的next即可③创建一个节点tail用于指向新链表的末尾④在两个原始链表非空的情况下原创 2020-07-23 18:35:21 · 132 阅读 · 0 评论 -
青蛙跳台阶问题
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)思路方法一:简单的动态规划(1)状态定义:f(n):跳到第 n 级台阶的总跳发(2)状态递推:f(n) = f(n-1)+f(n-2)(3)初始状态:f(0) = 1(第0级台阶即为起点,到达该处只有一种方法,既保持不动);f(1) = 1;方法二:斐波那契数列跳台阶问题,同样可以转化为斐波那契数列问题,可以采用求斐波那契数的方法求解代码package day3;原创 2020-07-22 20:20:14 · 106 阅读 · 1 评论 -
斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)思路(1)斐波那契数列(从第0项开始):0 1 1 2 3 5 8 13 21 34(2)斐波那契数列的特点:第 n 项,等于第(n-1)项和(n-2)项之和,即f(n) = f(n-1)+f(n-2);(3)两种做法:递归和迭代代码public class FibNum { //递归 private static int fib(int n){原创 2020-07-22 15:42:44 · 150 阅读 · 0 评论 -
二维数组的查找
题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数思路:(1)该数组的特点:从左到右递增,从上到下递增;(2)判断一个数是否在该二维数组中,有两种方法: ①遍历整个数组,一一查找; ②利用该数组的特点,每次从最左上角的元素开始找,一次可以排除一行或一列;(3)方法二: ①从最左上角的元素开始,该元素是本行最大的元素,本列原创 2020-07-20 19:05:17 · 92 阅读 · 0 评论