算法题
HDLaZy
生活不止眼前的CRUD,还有远方的框架源码!
展开
-
牛客:删除公共字符
题目描述:解题思路:使用Java的HashMap集合框架,HashMap无重复值,将字符串2的每一个字符存入其中,然后遍历字符串1的每一个字符,判断map中是否存在该值,如果不存在则拼接到新的字符串中,如果存在则不进行拼接。代码:import java.util.*;public class Main{ public static void main (String[] args){ Scanner scan = new Scanner(Sy原创 2022-05-24 20:46:22 · 146 阅读 · 0 评论 -
LeetCode-138-692
LeetCode138:题目描述:代码:class Solution { public Node copyRandomList(Node head) { if(head==null){return null;} Map<Node,Node> map=new HashMap<>(); Node cur=head; while(cur!=null){ No原创 2022-04-04 18:31:38 · 355 阅读 · 0 评论 -
LeetCode912-排序数组
方式1:直接插入排序class Solution { public int[] sortArray(int[] nums) { if(nums==null){ return nums; } for(int i=1;i<nums.length;i++){ int j=i-1; int temp=nums[i];原创 2022-03-30 20:31:14 · 1029 阅读 · 0 评论 -
LeetCode-面试题 17.14. 最小K个数
题目描述:解题思路:要求返回数组中最小的k个元素,使用java的最大堆数据结构。java的PriorityQueue默认为最小堆,需要写一个比较器将最小堆变为最大堆即可。 PriorityQueue<Integer> heap=new PriorityQueue<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer原创 2022-03-28 21:37:38 · 709 阅读 · 0 评论 -
剑指ⅡOffer68--剑指 Offer 36-LeetCode606
剑指ⅡOffer68题目描述:解题思路:情况1:当root等于p或者q,直接可以返回root情况2:当root的左右两边都存在p或q之一,则返回root情况3:当root的左右都没有p或q之一,则返回false情况4:如果root的左边找到p或者q之一,右边没有,则返回左边情况5:如果root的右边找到p或者q之一,左边没有,则返回右边代码:递归的查找p,qclass Solution { public TreeNode lowestCommonAncestor(TreeNod原创 2022-03-24 16:04:19 · 600 阅读 · 0 评论 -
LeetCode-110,101
LeetCode-110题目描述:解题思路:每一棵子树的高度差不超过1。需要左子树是平衡树,右子树是平衡树,且当前树是平衡树。使用递归的思想。代码:class Solution { public int getHigh(TreeNode root){ if(root==null){ return 0; } int leftH=getHigh(root.left); int rightH=getHi原创 2022-03-22 11:30:26 · 129 阅读 · 0 评论 -
LeetCode-222,100,572
LeetCode-222题目描述:解题思路:使用队列存储完全二叉树的节点,每次向队列中存储一个节点size就++。首次插入根节点后,当队列不为空,则出队,判断出队的节点是否含有左右子树,有则入队,且size++。代码:class Solution { public int countNodes(TreeNode root) { int size=0; Queue<TreeNode> queue=new LinkedList<>()原创 2022-03-22 10:27:58 · 321 阅读 · 0 评论 -
LeetCode-255,232,622
LeetCode-255题目描述:解题思路:使用两个队列实现一个栈,栈的特性先进后出,而队列先进先出。每次入栈操作,相当于往空队列入队。每次弹栈操作将不为空的队列的size-1个元素出队并入队到空队列里面,而剩的最后一个就是需要弹栈的元素。代码:class MyStack { private Queue<Integer> qu1; private Queue<Integer> qu2; public MyStack() {原创 2022-03-22 09:52:19 · 155 阅读 · 0 评论 -
LeetCode-144-102-剑指Ⅰoffer55
LeetCode144:题目描述:解题思路:前序遍历,根节点->左子树->右子树使用递归的思想,求当前树的前序遍历,则需要知道当前树的左子树和右子树的遍历顺序。注意:该方法返回值是List,所有需要将节点的val存入list。代码:class Solution { public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list=new ArrayList<&原创 2022-03-22 09:28:46 · 117 阅读 · 0 评论 -
LeetCode-20,155,面试题02.07
LeetCode20:题目描述:解题思路:先将字符串变为char[],遍历整个char[]。如果当前字符是左括号( { [,将此字符入栈,如果不是左括号,先判断栈是否为空,如果栈是空的,说明没有左括号,以右括号开头,则返回false。如果当前的字符和栈中的左括号匹配,则将栈顶出栈。最后需要判断栈是否为空,如果不为空则代表还存在未被匹配的左括号,则返回false。代码:class Solution { public boolean isValid(String s) { Stack原创 2022-03-22 09:16:24 · 178 阅读 · 0 评论 -
剑指Offer31-栈的压入弹出顺序
题目描述:思路:代码:class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { Stack<Integer> stack=new Stack<>(); int j=0; for(int i=0;i<pushed.length;i++){原创 2022-03-17 13:12:51 · 589 阅读 · 0 评论 -
LeetCode150-逆波兰表达式
题目描述:解释逆波兰表达式:通常运算式为:((2+1)*3)=9 这种成为中缀表达式,也就是一般计算的表达式,而对于计算机而言,它并不清楚表达式的计算顺序,如果想让计算机计算,则需要将中缀表达式转化为逆波兰表达式,也就是后缀表达式。比如 ((2+1)*3)=9 的逆波兰表达式就是,21+3 * 将这些值存入字符串数组。解题思路:计算机如何通字符串数组计算表达式的值呢?就需要使用到Stack(栈)。通过栈的特殊结构,即先进后出,后进先出。只需要遍历这个字符串数组,将数字压栈,如果碰到符号,则原创 2022-03-17 11:34:53 · 7060 阅读 · 0 评论 -
LeetCode141-环形链表-------剑指Offer022-链表中环的入口
题目描述:LeetCode141-环形链表思路:采用快慢指针,fast和slow都从head开始出发,slow每次走一步,fast每次走两步,如果存在环,则一定会相遇。代码:/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next =原创 2022-03-16 10:47:08 · 1261 阅读 · 0 评论 -
剑指Offer027-回文链表
题目描述:如果链表为空返回false链表长度为1返回true思路:首先这是一个单向链表,无法让它从后往前遍历,其次用 O(n) 时间复杂度和 O(1) 空间复杂度解决。如果想要从头节点向后遍历,从尾节点向前遍历,就需要将中间节点的后续所有节点进行反转。1:如何确定重点?定义fast 和 slow 节点,每次fast向后走两步,slow走一步,当fast == null或者fast.next == null,此时slow在中点位置。2:如何反转?定义cur,curNext结点。cur初始为sl原创 2022-03-16 09:16:49 · 709 阅读 · 0 评论 -
面试题02.04分割链表
题目描述:思路:需要将一个链表分为两部分,前部分小于x,后部分大于x。并且节点之前的顺序不能变。所以每次向新链表添加时需要进行尾插法。分为两部分,值大于x的分为一部分,小于x的分为一部分。使用as,ae来表示大的那一部分的头和尾节点。使用bs,be来表示小的那一部分。使用中间变量cur来代替head遍历链表。当第一次插入节点时,使得bs/as=cur,并且be/ae=cur。非第一次插入则让be/ae.next=cur,be/ae=be/ae.next,be/ae始终保持在链表尾部。当所有的节点遍历完原创 2022-03-15 14:25:16 · 968 阅读 · 0 评论 -
LeetCode21
题目描述:当两个链表都为空则返回空,存在一个为空返回另一个。思路:将两个有序链表合并为一个,将各个节点按照大小顺序串起来。定义一个节点作为合并后链表的头部:head,无实际意义,单纯的当作合并头节点。还需一个中间量temp=head。在添加节点的过程中,head不变,temp需要一直保持链表尾部。比较list1和list2的大小,temp.next=min(list1.val,list2.val),将较小的向后移动,min(list1.val,list2.val)=min(list1.val,lis原创 2022-03-15 10:55:50 · 153 阅读 · 0 评论 -
LeetCode876 --- 剑指Offer 22
题目描述:非空链表,我们不需要判断为空的条件。思路:需要得到链表的中间节点,也许会想到,将链表遍历一遍,求出长度,再遍历一遍得到中间节点。如果只能遍历一遍呢?中间节点,也就是链表长的二分之一,那就可以通过定义两个指向,都从head开始向后遍历。fast一次向后挪两个节点,slow一次向后挪动一个节点。当fast为null或者fast.next为null,代表着fast已经走到终点,而此时的slow恰好就遍历了一半链表,此时slow就处于中间节点的位置。代码:/** * Definition原创 2022-03-15 09:17:03 · 1263 阅读 · 0 评论 -
LeetCode206
题目描述:如果空链表则返回空。思路:如果想让一个链表逆序,需要使得节点的指向逆序。对于头节点head,它是反转后的尾节点,所以它的next为null,但在置为null之前,我们需要使用变量记住后续节点,所以cur=head.next。采取头插法,每次从剩余节点链中拿出头节点,将此头节点,以头插法的方式插入已经被拿出的链上。变量cur是用来表示剩余链的头节点,也就是下一个需要反转的节点。cur!=null,代表后续还有节点需要反转,中间变量temp=cur.next为了让cur再次回到剩余链的头节点。原创 2022-03-15 08:44:27 · 411 阅读 · 0 评论 -
LeetCode203
题目描述:思路:这是一个单向无头不循环的链表,当我们想删除链表中某一结点时,需要知道前驱节点和后继节点。对于要删除的cur节点来说,后继节点就是cur.next。所以我们只需要声明一个Node变量来记录要删除的节点的前驱节点即可。我们用pre来标记前驱节点,cur来标记需要被删除的节点,pre初始为head,cur初始为head.next。当cur.next != null时代表链表未遍历完,当cur为null时表示链表遍历结束。遍历过程中,我们只需要关注cur节点的val属性即可。当cur.val原创 2022-03-14 14:44:56 · 490 阅读 · 0 评论 -
LeetCode504
题目描述:输出一个数字的七进制数字,以字符串的方式返回。例子:100输出:2022x49+2x1=202例子:-7输出:-10-(1x7)代码:public static String convertToBase7(int num) { if(num==0){ return "0"; } StringBuilder str=new StringBuilder(); boolean flag=nu原创 2022-03-07 20:20:52 · 120 阅读 · 0 评论 -
LeetCode2100
题目描述:例子:代码:方法1:列子能跑,leetcode没跑过,超时。 public static List<Integer> goodDaysToRobBank(int[] security, int time) { List<Integer> list=new ArrayList<>(); for(int i=0;i<security.length;i++){ //判断下标是否符合要求原创 2022-03-06 20:13:09 · 79 阅读 · 0 评论 -
LeetCode125
题目描述:解题思路:1:首先忽略大小写,使用String的toLowerCase();2:提供方法判断的字符在0-9和a-z之间3:定义两个下标,left=0,right=str.length-14:当left<right的时候一直循环,当前字符如果不满足要求(不在0-9或者a-z),则left++或者right–5:当字符满足要求且相等left++,right–代码:public static boolean func(char ch){ if(ch>='0'原创 2022-03-04 14:04:45 · 128 阅读 · 0 评论 -
LeetCode387
题目描述:解题思路1:使用java的String类的toCharArray(),将String转化为char[],再遍历这个char[],使用String的lastIndexOf()和indexOf()分别判断字符首次和末次出现的位置,如果相等,则返回该下标。 public static int func(String str){ char[] chars = str.toCharArray(); for(int i=0;i<chars.length;i++){原创 2022-03-04 12:43:37 · 193 阅读 · 0 评论 -
旋转字符串
题目描述:如果一个字符串123456,存在一些旋转字符串:比如:234561345612456123561234612345那么如果给你两个字符串,如何判断它们存在这种关系?解法1:使用两层for循环遍历:public static boolean findStr1(String s1,String s2){ if(s1.length()!=s2.length()){ return false; } c原创 2022-02-28 08:14:16 · 80 阅读 · 0 评论 -
Java打印int类型二进制
在java中,int类型是4个字节,一共32位。java中int有正负,所以int类型表示范围位是-(2^(31))到 2^(31)-1如何打印一个int类型的变量的二进制?因为有32位置,所以我们从31-0开始计算,用该数字和1 <<(左移,相当于×2) i位相与。/** * ClassName:Test1 * Package:Work2 * Description: * 打印int的二进制 * @date:2022/2/28 7:25 * @author:HDLaZ原创 2022-02-28 07:37:12 · 1992 阅读 · 0 评论 -
Hanoi汉诺塔递归JAVA
问题描述:有A,B,C三个柱子,需要通过柱子B,将柱子A上的盘子挪到柱子C上,且挪动过程中,大盘子始终在下,小盘子始终在上。问,如果有n个盘子,需要挪动多少次。例子:A上有三个盘子当有3个盘子需要我们挪动七次。个人理解:使用递归,如果需要挪动n个盘子(n>1)时,那么对于最后一个大盘子n来说只需要3个步骤。1:将n-1个盘子挪到B柱子2:将最大的盘子n挪到C柱子3:将n-1个盘子挪到C柱子1:将n-1个盘子挪到B柱子2:将最大的盘子n挪到C柱子3:将n-1个盘子挪到C柱子原创 2022-02-21 03:00:06 · 240 阅读 · 0 评论 -
LeetCode2
题目描述:举例:代码(递归):/** * ClassName:TestDemo * Package:Work2 * Description: *给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 * * 请你将两个数相加,并以相同形式返回一个表示和的链表。 * * 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 * 输入:l1 = [2,4,3], l2 = [5,6,4] * 输出:[7,0,8原创 2022-02-22 21:17:40 · 194 阅读 · 0 评论 -
LeetCode1423
题目描述:个人理解:可以动态的判断首元素和尾元素的大小,在获得点数后,把该元素从数组中删除。也可以计算剩余点数最小,则被拿走的就是最大的点数。如果选择k个元素,则剩余的元素就是n-k个,n为数组大小。则可以采用滑动窗口从下标0->(k-1)一直到k-1->n-1。代码:/** * ClassName:TestDemo * Package:Work1423 * Description: *几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出原创 2022-02-19 21:51:07 · 182 阅读 · 0 评论 -
LeetCode1791
题目描述:个人理解:这个题不要想太多了,直接判断二维数组的前两个一维数组的值即可。也就是,第一个一维数组的第一个元素如果和第二个一维数组中的元素存在相同的值,则返回该元素,没有则返回第一个一维数组的第二个元素。复杂思路:n个点,n-1个边,对于中心点来说和它相连的必有n-1条边。所以除了中间节点的度是n-1,其余点的度为1。代码:/** * ClassName:TestDemo * Package:Work1791 * Description: *有一个无向的 星型 图,由 n 个编号从原创 2022-02-18 20:58:30 · 77 阅读 · 0 评论 -
LeetCode688
题目描述:举例:当棋盘n为3时,k为2时,从(0,0)开始走第一步走完只有两个位置在棋盘内部,(1,2)(2,1)第二步从(1,2)(2,1)走也分别有两个位置落在棋盘内部分别是(0,0),(0,2),(1,0),(2,1)所以在棋盘内的概率就是1/8/4*2=0.0625个人理解:对于8个走法,所对应的坐标偏移量就是:{-2, -1}, {-2, 1}, {2, -1}, {2, 1}, {-1, -2}, {-1, 2}, {1, -2}, {1, 2}采用动态规划:每一次从棋盘原创 2022-02-17 15:43:42 · 151 阅读 · 0 评论 -
LeetCode287
题目描述:个人理解:因为在一个长度为n+1的数组中,存入的数字为[1-n]所以必定有重复的数。我们知道对于Hashset集合来说,不能存入相同的数字。这是因为在存入HashSet时,先计算该数据的Hash值,如果Hash值重复则调用equals方法再次比较,结果为true则视为相同的元素,不能存入。如果equals的值为false则可以存入。(根据JDK版本不同,存入的方式也不同)当然也可以暴力解法,两层for循环,if的条件是值相同,下标不同,直接返回该数字即可。不过暴力解法不能过Le原创 2022-02-16 16:40:39 · 419 阅读 · 0 评论 -
LeetCode1380
题目描述:个人理解: 首先能想到的就是,遍历所以的元素,判断该元素是不是行最小,列最大。或者可以对矩阵进行预处理,找出每一行最小的数,找出每一列最大的数,分别组成line[]数组,column[]数组,遍历两个数组寻找相等的数字,line[]的下标就是矩阵的行下标,column[]数组的下标就是矩阵的列下标。源码:/** * ClassName:TestDemo * Package:Work1380 * Description: *给你一个 m * n 的矩阵,矩阵中的数原创 2022-02-15 18:11:12 · 83 阅读 · 0 评论 -
LeetCode540
题目描述:个人理解:对于这个唯一数的下标一定为偶数,且左右两边都有偶数个数,数组长度为奇数。所以使用二分查找能够更快速的找出唯一数。当找到中间数(mid)时,需要判断mid和两边的数字是否相等。需要分情况进行:* 当mid下标为奇数时,需要和前面一个数字相比较* 当mid下标为偶数时,需要和后面一个数字相比较判断后需要对左右两边界进行更新:*当mid和前一个数字相等时,则缩小左边界(左边界为mid+1,因为mid左侧+1则为偶数个数) *当mid和后一个数字不相原创 2022-02-14 02:00:47 · 177 阅读 · 0 评论