java基础
mmmmmao77
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
剑指 Offer 42. 连续子数组的最大和
class Solution { public int maxSubArray(int[] nums) { if(nums==null || nums.length==0){ return 0; } int sum=-101; int temp=0; for(int i:nums){ temp= i+temp; if(sum<temp){.原创 2021-12-11 22:32:54 · 371 阅读 · 0 评论 -
数据流中的中位数
class MedianFinder { /** initialize your data structure here. */ PriorityQueue<Integer> left; PriorityQueue<Integer> right; public MedianFinder() { left=new PriorityQueue<Integer>((x,y)->y-x); right =.原创 2021-12-11 22:07:06 · 306 阅读 · 0 评论 -
剑指 Offer 37. 序列化二叉树 思路与代码
思路:这一个问题需要分两步:1.序列化:把二叉树变成一个字符串。可以使用层序遍历或者前序遍历。代码选择使用层序遍历,注意null也要加进去,否则无法重构二叉树。2.反序列化:把字符串分割成数组,使用一个m计算出现了多少个null,计算子节点的时候就-2*m。 另一个思路是使用一个队列。null就直接跳过,数就构建树后 加入队列。如果使用前序遍历,注意把null也遍历进来。在反序列化的时候,使用递归,将字符串变成 存着值得 List,判断 节点为 null就return nul...原创 2021-12-02 18:09:03 · 272 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表 思路与代码
思路:遇到类似的题,没见过没关系,不要慌!先分析它给出的结构与需要的结构各有什么特点?一定是根据各自的特点去写代码。可以看到给的数是一个二叉搜索树,二叉搜索树有什么特点呢?二叉搜索树的左子树都小于这个节点,右子树都大于这个节点。它的中序遍历是从小到大遍历的。题目需要的是什么结构?是一个双向的循环链表,而且是一个有顺序的。这个特点跟二叉搜索树中序遍历不谋而合,分析到这就很明朗了,十有八九就是利用中序遍历解决问题!!中序线索化二叉树与这个类似。可以定义一个前置节点pre,使用flag记录...原创 2021-11-29 22:13:31 · 96 阅读 · 0 评论 -
剑指 Offer 35. 复杂链表的复制 思路与代码
思路:这一题最开始没想出来,想了很久都觉得很复杂。看了答案有两个方法:1.使用递归和哈希表,创建一个哈希表,key为原链表中的元素,value为复制链表中的元素。递归判断,是否存在key。如果存在key 就说明已经创建了该复制节点,拿到复制节点。如果不存在key,说明没有创建该复制节点,应该new一个节点,next 和random都调用递归方法拿到。最终拿到的headcopy就是满足题意的。2.第二个方法使用复制双节点的方法,很巧妙。需要遍历三次:首先第一次遍历,把链表每一...原创 2021-11-27 22:32:39 · 4116 阅读 · 0 评论 -
剑指 Offer 33. 二叉搜索树的后序遍历序列 思路与代码
思路: 遇到这种问题,要先想想这个结构有什么特点。也就是它是什么样结构,它后序遍历的数组有什么特点? 可以看到规律,数组中最后一个元素总是树的根节点,并且它前面的数组中前一部分都小于它,后一部分都大于它。如果满足这个,就可以递归判断。直到数组中只有2个元素或者1个元素(必定可以组为二叉排序树)。 每一层都使用递归判断是否符合二叉排序树后序遍历的规律,最终可以返回结果。class Solution { public boolean verifyPostorder(int[] po...原创 2021-11-25 13:14:35 · 281 阅读 · 0 评论 -
剑指 Offer 32 - III. 从上到下打印二叉树 III 思路与代码
思路:需要将奇数行正序输出,偶数行倒叙输出。可以使用双端队列,双端队列可以控制加入与移除的是第一个还是最后一个。因此我们可以加入一个count,每次循环便加1,用来判断这一层是奇数还是偶数。如果为奇数,那么就将每一个数据加入到双端队列的最后面。得到的为正序。如果为偶数,那么将每一个数据加入到双端队列的最前面,得到的为倒序。这样就完成了树的正序与倒序的输出。还可以控制que那一个双端队列的API,实现这个功能。也可以正常输出,在加入到list前判断...原创 2021-11-24 22:13:44 · 434 阅读 · 0 评论 -
剑指 Offer 32 - II. 从上到下打印二叉树 II 思路与代码
思路:这一题需要每一行的元素在一起输出。可以使用队列来记录,队列的长度为该行元素的个数(n)。循环n次,为一行。把该行元素存入temp的集合中,循环结束加入list当中。判断如果队列不为空,那么开启下一次循环,新建一个temp集合,继续循环队列的长度n次。把元素放入temp集合当中。直到队列为空,说明所有元素都被遍历了。 写代码的时候遇到了一个容易被忽视的点:我想在前面把temp建好,每次temp.clear(),把集合清空再循环。这里很容易想错,每一个循环中temp都指向一个地...原创 2021-11-23 23:29:30 · 107 阅读 · 0 评论 -
剑指offer 32 从上到下打印二叉树 思路与代码
思路:层序遍历,思路很简单,新建一个队列,如果节点不为空,就把节点的左节点与右节点加入队列。每次循环从队列中取出最前面的节点输出。直到队列为空为止。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } *...原创 2021-11-23 22:20:53 · 110 阅读 · 0 评论 -
剑指 Offer 29. 顺时针打印矩阵 思路与代码
思路:首先可以明确需要输出多少个数是知道的。也就是行数*列数。我的思路是定义四种状态,上下左右。同时定义四个边界。让一个指针在边界围成的空间中按照四种状态移动。每次移动到边界,改变其状态,同时移动边界。直到输出结束。思路和代码都比较简单另外还可以使用画框的方式:大框走一圈,把边界往中间移一圈。此时开始的坐标为原坐标的右下位置。同样也需要有边界限制。可以通过判断起点是否位于边界之外判断是否循环结束。class Solution { ...原创 2021-11-22 22:53:22 · 246 阅读 · 0 评论 -
剑指 Offer 31. 栈的压入、弹出序列 思路与代码
思路:模拟栈弹出的过程。通过popped数组监控栈的情况。如图中实例2,栈第一个弹出的元素是4,那么就把pushed中的指针移到5的下方。把1,2,3,4都放入栈中。再判断下一位popped【i】与栈顶元素相同吗?如果不相同,就让pushed的下标往后移,同时把元素加入栈,直到遇到与popped【i】相等的数,或者到达数组边界为止。如果相同,就pop()该元素,继续循环。循环结束,判断栈是否为空,如果为空,说明按照规则弹出加入,返回true。...原创 2021-11-21 21:52:51 · 264 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像 代码与思路
思路:看到树,第一时间要想到递归。使用递归的方法,前序遍历,把每一个节点的左右子树都进行交换。最后拿到的根节点就是所需要的树。 还可以使用栈的方法,遍历存储所有节点,再弹出交换所有节点的左右子树。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeN...原创 2021-11-21 20:53:27 · 248 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构 思路与代码
思路:由题意可知,我们需要判断树B是不是树A的子树。不管怎么样,肯定要在树A中找到与B树根节点val值相等的节点。可以选择递归或者非递归的遍历。找到节点值与树B根节点val值相等的节点。进入compare递归判断它们的结构是不是相等的(注意:在递归时如果某次递归B节点为空,那么不管A是不是空,肯定返回true。如果B节点不为空,判断如果A节点为空,那么肯定返回false。两个都不为空的情况下,判断两节点的值是不是相等的,如果是相等的,继续左节点、右节点调用compare递归...原创 2021-11-18 22:23:05 · 382 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表 思路和代码
思路: 新建一个链表头结点。两个指针分别在两个链表头部,比较哪一个小。把小节点放到新的空 头结点下一位。然后新链表与小的节点所在的链表的指针都向后移一位。再次比较。直到某一个链表到尾部。将另一个还未到头的链表的指针所在节点直接接到新链表尾部。 这里我原先是遍历加入的,后来看到可以直接把剩余链表的尾部直接接到新链表尾部。这个方法更好! 最后返回新链表头结点的next节点即可。/** * Definition for singly-linked list....原创 2021-11-18 21:38:04 · 437 阅读 · 0 评论 -
剑指 Offer 24. 反转链表 思路与代码
思路: 倒着输出首先想到的是栈,但是栈需要遍历两次,且需要n的空间来储存链表。可以利用三个指针来一边遍历,一遍改变指针的指向。1 2-> 3 把Node2的next指向1时,相当于截断了链表,因此需要第三个指针在截断前,保存Node3。最终cur==null 时,pre就是所要的链表的头结点。/** * Definition for singly-linked list. * public class ListNode { * int val...原创 2021-11-17 22:53:53 · 4102 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点 思路和代码
思路:倒着数第k个,两个指针,先让一个指针前进k-1,再一起前进,先走的那个指针走到最右边,这时走得慢的指针所在的位置就是所求的倒数第k个。注意,要考虑特殊情况,养成好习惯。(k的值大于链表长度,k小于等于0,链表为空)/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { ...原创 2021-11-17 22:24:13 · 360 阅读 · 0 评论 -
剑指offer 21 调整数组顺序使奇数位于偶数前面 思路与代码
思路:数组前面和后面属性不一样,前面是奇数,后面是偶数,可以想到利用两个指针前后进行判断和交换。保证左指针的左边一定是奇数,右指针的右边一定是偶数。结束条件就是两个指针相遇。代码如下:class Solution { public int[] exchange(int[] nums) { if(nums==null || nums.length==0){ return nums; } //奇数在前面 偶数...原创 2021-11-17 22:15:03 · 107 阅读 · 0 评论 -
剑指 Offer 20. 表示数值的字符串 思路与代码
思路:这类题需要考虑的情况特别多,一时间很难考虑周到,因此要做好不断完善代码的准备。把输入的字符串先trim() 一下,去除两端的空格。整体转换为一个char类型的数组cc。之后从头到尾遍历这个数组,判断处于什么情况。判断的指标整体分为三个:遇到点了吗,遇到e/E了吗,遇到数字了吗。可以根据这个思路写代码,把正常的情况全部通过,其余的都直接返回false。需要注意的典型错误情况为:点前后都没有数字。e前没有数字(这两个可以直接用isnum的值来判断)。正负号应...原创 2021-11-14 22:53:41 · 237 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点 思路与代码
思路:使用一个或者两个指针定位,检测head节点val是否等于value,如果等于就直接返回head.next。检测指针的下一个节点val值是不是等于val,倘若等于,就另指针的下一个元素指向下下个元素(可能为null,不影响),此时返回head节点即可。 循环到结束没找到符合条件的节点,也直接返回head即可。注意:假如题中给的不是val值,而是要删除的节点,则判断节点的next是不是null,如果是null。从head开始遍历,找到这个节点的上个节点,令其next=...原创 2021-11-08 21:57:14 · 238 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方 思路和代码
思路:首先,使用循环乘法的方式肯定太慢了。可以使用二分的思路大大缩短运算成本。 需要考虑x==0,n<0的情况,可以选择递归的方法与循环的方法递归的方法:如果一个数的指数是偶数,那么二分的之后,就是两个数相乘。如果它的指数是奇数,则两个数相乘后还要乘上x。class Solution { public double myPow(double x, int n) {//搞一个递归回溯运算更快// 8 -- 4 4 // 9 -- 4 4 1...原创 2021-11-08 21:02:21 · 102 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
思路:这种题应该首先想到使用位运算,位运算的运算速度相当快。我的思路是使用一个1不断地左移,不断地与目标数或运算。如果结果数不变,说明这一位原本为1,计数count++,如果结果数变了,说明这一位原本为0。执行32次,就可以把int类型数全部算完。一个更好地思路:把n减1 与原来的数并运算。看结果是不是为0;如果不为0 说明前面还有1,计数count++。一直执行while循环 计算后值为0停止循环。count为所需要的数。 2的幂也可以使用这个方法算,...原创 2021-11-07 22:56:01 · 91 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子 思路和代码
找规律如下; 可以看到从5开始就有规律了。某个数减去3 如果结果大于或等于2,就减,否则就别减了。可以根据找到的规律很容易地写出代码。2 1 13 1 24 2 25 236 337 348 332class Solution { public int cuttingR...原创 2021-11-07 22:02:24 · 95 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围 思路和代码
思路:由题意可以看出,类似于二维的迷宫问题。首先想到使用二维矩阵 递归与回溯的方法解题。测试用例(k,m,n小于0) 需要有一个boolean数组来记录是否走过,count数来记录走过多少个格子。判断是否满足的代码实现方式比较多样,计算两个数各位的相加 我想到转换为字符串长度判断位数,循环相加即可。还可以使用 整除 取余等于0 两个命令或运算。两个都为0说明这个数为0,否则不为0 继续循环计算即可。由于需要计算路径格子的总数,所以没有终止条件,一直往前走。判断完返回f...原创 2021-11-07 21:46:49 · 157 阅读 · 0 评论 -
剑指offer 12 矩阵中的路径 思路及代码
思路:这是一个典型的二维迷宫问题,首先应该想到的是使用递归回溯的方法去找到正确的路径。首先确定测试用例,(空字符串,字符串长度为0,空数组,数组长度为0,矩阵里面包含字符串,不包含字符串)。看到题目要求判断是否包含字符串。首先需要循环遍历找到矩阵中字符与字符串中首位相等的元素下标。进入方法进行递归回溯查找。个人感觉类似于深度遍历的过程。最需要注意的是需要避免来回判断,比如{a,a} “aaa” 如果没有考虑到的话很容易导致回头判断的情...原创 2021-11-07 21:10:08 · 100 阅读 · 0 评论 -
剑指 Offer 30. 包含min函数的栈 思路分析和代码
思路如下: 题中要求min、push、和pop的时间复杂度都要为O(1),就不能使用遍历找出最小值了。所以需要想办法在加入元素的时候记录min。因为不知道存入多少个,还需要搞一个数组扩容命令。 我最初的代码是计划使用一个数组动态规划的形式记录每一位的min值,新加入的时候与min【temp-1】比较,如果比它小 min【temp】=arr【temp】,否则min【temp】=arr【temp-1】. 后来发现题解中有一个更加聪明的记录方法。使用主栈A&...原创 2021-11-01 21:47:37 · 123 阅读 · 0 评论 -
剑指offer06 从尾到头打印链表 思路及代码
想到了两个方法原创 2021-11-01 21:31:21 · 95 阅读 · 0 评论 -
单向链表构建的栈和字符串计算器代码
栈:public class StackAsLinked<TT> { int size=10; Node1 back; Node1 fanhui; Node1 n0=new Node1 ( null ); int count=0; public static void main ( String[] args ) { StackAsLinked s2 = new StackAsLinked (); Scan原创 2021-09-29 22:41:22 · 119 阅读 · 0 评论 -
关于Comparator泛型?super T的问题
为什么自定义类数组的排序中sort()的形参可以是:(T[] ,Comparator<? super T>)T(如例子中的person)的父类只要实现了Comparator<T父>那么子类T的数组T[] 可以调用sort(T[] ,父类的对象)。按照父类中实现的compare排序方法,进行排序。public class Test1 { public static void main ( String[] args ) { Person p1原创 2021-09-24 12:56:31 · 718 阅读 · 0 评论 -
尚硅谷项目二代码
1.工具类(自己写了一下,主要功能都有)package ProjectTwo;import javax.print.DocFlavor;import java.util.Scanner;public class CMUtility { private static Scanner s1 = new Scanner(System.in); /** * @Description: 获取键盘输入值,limit限制长度,fanhui为真,可输出”“,返回为假,再次...原创 2021-09-18 23:57:36 · 1020 阅读 · 4 评论 -
尚硅谷项目二客户管理练习 思路和经验
整体思路:我们需要保存很多个用户,所以使用数组比较好,而用户各自都有他们的属性,比如名字,性别等。所以需要将用户当做数组的一个个元素保存在数组中。需要调取某人的某个属性,直接使用数组下标定位,调取getter setter方法就可以了。对数组层面的操作有添加元素,删除某个元素,修改某个元素,可以在一个类中完成。最后就是界面层了,显示项目运行的各种信息,提示怎么输入等功能都需要在这个层面来完成。分为四个大类,1.工具类 CMUtility 工具类就像一...原创 2021-09-18 23:52:19 · 206 阅读 · 0 评论
分享