OJ
草里多
这个作者很懒,什么都没留下…
展开
-
二叉搜索树与双向链表
题目描述:描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表注意:1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继2.返回链表中的第一个节点的指针3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构4.你不用输出或者处理,示例中输出里面的英文,比如"From left to right are:"这样的,程序会根据你的返回值自动打印输出示例:输入: {10,6,14,4原创 2021-06-30 21:24:03 · 92 阅读 · 0 评论 -
复杂链表的复制
题目描述:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。 下图是一个含有5个结点的复杂链表。图中实线箭头表示next指针,虚线箭头表示random指针。为简单起见,指向null的指针没有画出。解题思路:首先,拿到这道题的时候,我们都知道链表的节点很容易复制,那链表的前后指向关系如何得到呢,其实还是得遍历链表来找到原创 2021-06-30 16:27:01 · 89 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述:描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜素树)示例1输入:[4,8,6,12,16,14,10]返回值:true解题思路:解这个题,首先要了解什么是二叉搜索树。二叉搜索树:当一个树不为空的时候,对于二叉树中的每一个节点都有:该节点的左子树不为空的时候,左子树的所有的值都是小于该节点的值,该节点的右子树不为空的时候,右子树的每一个节点的值都大于原创 2021-06-26 15:50:26 · 178 阅读 · 0 评论 -
栈的压入、弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)示例1输入:[1,2,3,4,5],[4,3,5,1,2]返回值:false解题思路:按照我们平时的想法,判断一个序列是否可能是正确的出栈序列。首先判断出栈的第一个数字是多少,由于栈的原创 2021-06-20 16:11:00 · 107 阅读 · 0 评论 -
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)示例1输入:{8,8,#,9,#,2,#,5},{8,9,#,2}返回值:true解题思路:首先最能想到的就是我们可以先遍历A树,然后在A树里面找是不是有和B树根节点相同的节点,如果有的话就从该节点向下,一直对比比较,看是否每一个节点相同,知道b数遍历到空节点。如果这个过程中返回值都为true,那就说明B树是A树的子结构,如果在这个过程中有一个不是的话,那就返回false。代码展示:/**原创 2021-06-15 21:02:41 · 144 阅读 · 0 评论 -
反转链表----遍历一次进行反转
题目描述:输入一个链表,反转链表后,输出新链表的表头。示例1输入:{1,2,3}返回值:{3,2,1}解题思路:思路之一:就是使用三个指针来对链表进行遍历,然后在每次改变指针位置的时候,改变链表连接的方向。代码展示:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class原创 2021-06-14 19:02:07 · 193 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目描述:描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路:在这个题里面,要求奇数和技术,偶数和偶数之间的相对位置不变。所以可以采用一插入排序的思想对其进行解决。因为奇数是位于数组前面的,所以我们遍历数组,对于每个奇数做一下的操作,将奇数插入奇数序列的后面,最开始这个奇数序列是大小为0,然后一点一点的加长。最终前面的序列都是奇数,后面的序列都是偶数,所以就解决了这个问题原创 2021-06-14 16:13:59 · 133 阅读 · 0 评论 -
sleep()方法和wait)方法的区别
我们都知道sleep()方法和wait()方法是两个不同的方法,但是却有着类似的作用。sleep() 方法的作用是在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行)。这个“正在执行的线程”是指 this.currentThread() 返回的线程。wait()方法是让当前线程等待。 wait会释放锁,等到其他线程调用notify方法时再继续运行。接下来介绍一下两个方法的区别:类的不同:wait()方法是object()类里面的,而sleep()是属于Thread类的。sleep()方法原创 2021-06-11 12:18:00 · 486 阅读 · 1 评论 -
二分法--旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解题思路:通过本题,我们可以理解为:一个非递减数组进行了旋转,找出这个旋转后的数组里面的最小值。我们可以根据二分法的思想来进行寻找最小的数字。预设三个指针,一个指向区间头部,一个指向区间尾部,根据区间头尾求出区间的中间位置。比较中间位置的数字和区间尾部、区间头部。比较中间值和最后位置的值。分为三种情况:1原创 2021-06-10 11:11:23 · 106 阅读 · 0 评论 -
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路:使用两个栈来实现一个队列的功能。首先我们了解的是栈是先进后出的特点,而队列是先进先出的特点。所以我们可以利用两个栈来实现先进先出的特点,即先将数字放进一个栈里面,然后再次出栈,放到另外一个站里面,知识后最先放进去的元素就在另一个栈的栈顶了,这个时候就可以出栈了。代码实现:import java.util.Stack;public class Solution { Stack<原创 2021-06-09 21:40:10 · 219 阅读 · 0 评论 -
输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
题目描述:输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。输入描述:输入包含三行,第一行包含两个正整数n, m(1 ≤ n,m ≤ 100),用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。第二行包含n个整数(范围1~5000),用空格分隔。第三行包含m个整数(范围1~5000),用空格分隔。输出描述:输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。示例1输入:5原创 2021-06-04 20:53:43 · 1818 阅读 · 0 评论 -
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
题目描述:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。解题思路:如上图,我们可以使用快慢指针的方法来解决该问题。快指针走两步,慢指针走一步,然后如果说链表存在环的话,就应该两个指针最终会相遇;假设相遇的点为p,并且假设环的入口为q。那么在相遇点p就会有快指针所走的路程是慢指针的两倍;可以得到表达式:2(a+b)=(a+nb+(n-1)c);可以得到a=c;根据这个表达式,我们可以再新增一个指针,让新增指针指向链表头部,然后头部指针和指向p点的慢指针一起以相同的速度走,这原创 2021-04-23 10:42:14 · 268 阅读 · 1 评论 -
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
题目描述输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)思路分析:根据题意知道要求两条链表的第一个公共节点。我们很容易想到,当两个链表是一样长的话,我们就很容易知道第一个公共节点,即定义两个指针:分别指向两个链表的头,一起移动,每次判断是否相等,第一次相等的节点就是公共节点。根据这个思想我们可以构建相等的链表:比如ab两条链表,长度不相等,我们可以分别遍历a+b链表和b+a链表;这样两个链表的长度就相等了,那么同时移动,原创 2021-04-03 20:54:04 · 122 阅读 · 0 评论 -
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。示例1输入[3,32,321]返回值“321323”解题思路:先将数字i1和数字i2拼接在一起;然后将数字i2拼接在数字i1的前面,比较得到的两个数字哪个大;如果前者得到的数字大,那就交换i1和i2的所在位置;重复这个操作,然后将数组的数字按顺序拼接起来就是答案;代码展示:import java.util原创 2021-03-30 21:34:22 · 472 阅读 · 0 评论 -
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。 如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜索树)示例1输入[4,8,6,12,16,14,10]返回值true思路分析:二叉搜索树的特点是:如果当前节点有左子树,那么左子树的每一个节点的值都小于等于当前节点的值;如果当前节点有右子树,那么右子树的每一个点的值大于当前节点的值;再来分析:树的后序遍历特点是什么,遍历顺序肯定是先左子树,后右子树,最原创 2021-03-16 17:18:32 · 1419 阅读 · 0 评论 -
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。示例1输入复制{5,4,#,3,#,2,#,1}返回值复制[5,4,3,2,1]解题思路:使用一个队列来存储节点,每次从队列里面取出一个元素,同时将他的两个孩子节点放进队列里面。从而实现层序遍历代码实现:import java.util.ArrayList;import java.util.*;/**public class TreeNode { int val = 0; TreeNode left原创 2021-03-14 21:39:20 · 197 阅读 · 0 评论 -
开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动。
题目描述:开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。输入:合法坐标为A(或者D或者W或者S) + 数字(两位以内)坐标之间以;分隔。非法坐标点需要进行丢弃。如AA10; A1A; %; YAD; 等。下面是一个简单的例子 如:A10;S20;W10;D30;X;A1A;B10A11;;A10;处理过程:起点(0,0)A10 = (-10,原创 2021-03-13 13:41:44 · 2131 阅读 · 8 评论 -
给定无序整数序列,求连续子串最大和。
题目描述:给定无序整数序列,求连续子串最大和,例如{-23 17 -7 11 -2 1 -34},子串为{17,-7,11},最大和为21输入描述:输入为整数序列,数字用空格分隔,如:-23 17 -7 11 -2 1 -34输出描述:输出为子序列的最大和:21思路:使用两个变量分别存储子数组最大的值,和当前位置子数组最大的值。遍历数组,并且每次都要判断当前最大值是否小于0,如果小于零就舍弃掉,因为会拉低后面的值。并且面次更新子数组和的最大值。import java.util.Scanner原创 2021-03-13 10:11:04 · 366 阅读 · 0 评论 -
操作给定的二叉树,将其变换为源二叉树的镜像。
题目要求:操作给定的二叉树,将其变换为源二叉树的镜像。解题思路:将根节点的两个子树交换。递归完成。代码:public class Solution { public void Mirror(TreeNode root) { if(root==null){ return; } TreeNode temp=root.right; root.right=root.left; root.left原创 2021-03-12 23:36:59 · 77 阅读 · 0 评论 -
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)示例1输入{8,8,#,9,#,2,#,5},{8,9,#,2}返回值true解题思路:遍历树a,找到与树b根节点相同的节点,从这个节点开始,a树和b树同时向下遍历。遍历如果发现该过程中有节点的值不相等那就返回false;如果值相等就继续向下遍历。遍历的出口是有一个树的节点为空了。根据这个结果判断:如果树a为空了,那说明b不是a的子树。如果b树为空了,说明b树是a树的子结构。代码展示:.原创 2021-02-23 13:56:18 · 391 阅读 · 0 评论 -
输入一个链表,输出该链表中倒数第k个结点。
题目描述:输入一个链表,输出该链表中倒数第k个结点。示例1输入1,{1,2,3,4,5}返回值{5}解题思路:定义两个指针,先让一个指针走k步,然后两个指针一起走,最终到达终点,满的指针就是题目所求。public class Solution { public ListNode FindKthToTail(ListNode head,int k) { ListNode fast=head; ListNode slow=head; fo原创 2021-02-21 17:30:35 · 100 阅读 · 0 评论 -
题目描述 输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
题目描述输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。示例1输入10返回值2解题思路:我们先来观察一组数的二进制形式:000 0001 1010 2011 3100 4101 5110 6111 7我们看这个二进制对应的整数,观察可以发现第n个数和第n-1个数,二进制数字之间的关系:比如说数字6的二进制,从右边看第一个1,后面是0,而5对应二进制和6对应的最右边的1所对应的的数字是取反的,向右以为也是如此。即从n的原创 2021-02-21 11:26:14 · 799 阅读 · 0 评论 -
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
题目要求:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。示例1输入复制3返回值复制4解题思路:逆向思维:站在第1个台阶上往下走,有一种方法1f(1-1);站在第二个台阶向下走那就有1f(2-1)+1f(2-2)种方法……站在第n个台阶上,就有1f(n-1)+1f(n-2)+1f(n-3)+……+1f(n-n)种走法。所以会得出结论:f(n)=f(n-1)+f(n-2)+f(n-3)+f(n-4)+……+f(0);f(n原创 2021-02-21 10:07:15 · 310 阅读 · 0 评论 -
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出 肯定坏掉的那些键。
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。输入描述:输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括大、小写)、数字0-9、以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。输出描述:按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有1个坏键。示例1输入7_This_is_a_t原创 2021-02-05 21:55:54 · 890 阅读 · 0 评论 -
上台阶(斐波那契变种)
有n级台阶,每一步可以走1级或2级,问一共有多少种走法输入描述:台阶的级数n输出描述:走法数量示例1输入2输出2说明走法为1+1或2这个题很像斐波那契;假设他在最上面;那就求他前一级台阶的走法+他前两级台阶的走法。代码如下:import java.util.Scanner;public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in)原创 2021-02-04 22:49:40 · 165 阅读 · 0 评论 -
“锤子剪刀布”的游戏:
"锤子剪刀布”的游戏:现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。输入描述:输入第1行给出正整数N(<=105),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C代表“锤子”、J代表“剪刀”、B代表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个空格。输出描述:输出第1、2行分别给出甲、乙的胜、平、负次数,数字间以1个空格分隔。第3行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有1个空格。如果解不原创 2021-02-04 22:32:40 · 122 阅读 · 0 评论 -
能够PING通同网段的节点,但却如PING不通其他网段的所有节点的最可能的原因
题目:能够PING通同网段的节点,但却如PING不通其他网段的所有节点的最可能的原因A: 本机网关设置错误B: 本机没有正确设置DNSC: 对方运行的是不同的操作系统D: 二层交换机故障正确答案:A解析:PING命令用于验证与远程计算机的连接。该命令只有在安装了 TCP/IP 协议后bai才可以使用。Ping命令的主要作用是通过发送数据包并接收应答信息来检测两台计算机之间的网络是否连通。当网络出现故障的时候,可以用这个命令来预测故障和确定故障地点。Ping命令成功只是说明当前主机与目的主机之间原创 2021-02-03 22:38:00 · 5092 阅读 · 0 评论