博客记录-day152-力扣+分布式

一、力扣

1、最长重复子数组

718. 最长重复子数组

dp[i][j]定义为以nums1的i结尾和以nums2的j结尾的最长重复子数组长度。

java 复制代码
class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        int m=nums1.length,n=nums2.length;
        int[][] dp=new int[m+1][n+1];
        int res=0;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(nums1[i]==nums2[j]){
                    dp[i+1][j+1]=dp[i][j]+1;
                }else{
                    dp[i+1][j+1]=0;
                }
                res=Math.max(res,dp[i+1][j+1]);
            }
        }
        return res;
    }
}

2、删除排序链表中的重复元素 II

82. 删除排序链表中的重复元素 II

思路:当出现两个数相等后,删除第一个数,继续下一个

java 复制代码
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode dummy=new ListNode(0);
        dummy.next=head;
        ListNode pre=dummy;
        while(pre.next!=null&&pre.next.next!=null){
            int cur=pre.next.val;
            ListNode sec=pre.next.next;
            if(sec.val==cur){
                while(pre.next!=null&&pre.next.val==cur){
                    pre.next=pre.next.next;
                }
            }else{
                pre=pre.next;
            }
        }
        return dummy.next;
    }
}

3、 K 个一组翻转链表

25. K 个一组翻转链表

java 复制代码
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode dummy=new ListNode(0);
        dummy.next=head;
        int n=0;
        for(ListNode temp=head;temp!=null;temp=temp.next) n++;
        ListNode pre=dummy;
        ListNode cur=head;
        for(;n>=k;n-=k){
            ListNode las=null;
            for(int i=0;i<k;i++){
                ListNode nextcur=cur.next;
                cur.next=las;
                las=cur;
                cur=nextcur;
            }
            ListNode nextpre=pre.next;
            nextpre.next=cur;
            pre.next=las;
            pre=nextpre;
        }
        return dummy.next;
    }
}

4、和为 K 的子数组

560. 和为 K 的子数组

java 复制代码
class Solution {
    public int subarraySum(int[] nums, int k) {
        int res=0;
        int sum=0;
        Map<Integer,Integer> map=new HashMap<>();
        map.put(0,1);
        for(int i=0;i<nums.length;i++){
            sum+=nums[i];
            res+=map.getOrDefault(sum-k,0);
            map.merge(sum,1,Integer::sum);
        }
        return res;
    }
}

5、最大数

179. 最大数

java 复制代码
class Solution {
    public String largestNumber(int[] nums) {
        int n=nums.length;
        String[] ans=new String[n];
        for(int i=0;i<n;i++){
            ans[i]=""+nums[i];
        }
        Arrays.sort(ans,(a,b)->{
            String temp1=a+b;
            String temp2=b+a;
            return temp2.compareTo(temp1);
        });
        StringBuilder res=new StringBuilder();
        for(String s:ans){
            res.append(s);
        }
        int len=res.length();
        int point=0;
        while(point<len-1&&res.charAt(point)=='0'){
            point++;
        }
        return res.substring(point);
    }
}

6、合并区间

56. 合并区间

java 复制代码
class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals,(a,b)->{
            if(a[0]==b[0]){
                return a[1]-b[1];
            }else{
                return a[0]-b[0];
            }
        });
        ArrayDeque<int[]> stack=new ArrayDeque<>();
        stack.push(new int[]{intervals[0][0],intervals[0][1]});
        for(int i=1;i<intervals.length;i++){
            if(intervals[i][0]>stack.peek()[1]){
                stack.push(new int[]{intervals[i][0],intervals[i][1]});
            }else{
                stack.peek()[1]=Math.max(stack.peek()[1],intervals[i][1]);
            }
        }
        int[][] res=new int[stack.size()][2];
        int point=0;
        while(!stack.isEmpty()){
            res[point++]=stack.pollLast();
        }
        return res;
    }
}

7、用最少数量的箭引爆气球

452. 用最少数量的箭引爆气球

java 复制代码
class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points,(a,b)->{
            if(a[0]==b[0]) return Integer.compare(a[1],b[1]);
            return Integer.compare(a[0],b[0]);
        });
        ArrayDeque<int[]> stack=new ArrayDeque<>();
        for(var e:points){
            if(!stack.isEmpty()){
                if(e[0]>stack.peek()[1]){
                    stack.push(e);
                }else{
                    stack.peek()[1]=Math.min(stack.peek()[1],e[1]);
                }
            }else{
                stack.push(e);
            }
        }
        return stack.size();
    }
}

8、无重叠区间

435. 无重叠区间

java 复制代码
class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        // 按照区间的起始点升序排序,如果起始点相同则按结束点升序排序
        // 这样排序的目的是优先选择起始点靠左且结束点更早的区间,以便为后续区间留出更多空间
        Arrays.sort(intervals, (a, b) -> {
            if (a[0] == b[0]) {
                return Integer.compare(a[1], b[1]); // 起始点相同,结束点小的在前
            }
            return Integer.compare(a[0], b[0]);     // 起始点升序排列
        });

        int res = 0; // 记录需要移除的区间数量
        int pre = intervals[0][1]; // 初始化前一个区间的结束点为第一个区间的结束点

        // 从第二个区间开始遍历
        for (int i = 1; i < intervals.length; i++) {
            // 当前区间的起始点小于前一个区间的结束点,说明有重叠
            if (intervals[i][0] < pre) {
                res++; // 需要移除当前区间,计数加一
                // 更新前一个区间的结束点为当前区间结束点和前一个结束点的较小值
                // 这样可以尽量让后续区间有更多空间,减少后续重叠的可能
                pre = Math.min(pre, intervals[i][1]);
            } else {
                // 无重叠,更新前一个区间的结束点为当前区间的结束点
                pre = intervals[i][1];
            }
        }

        return res;
    }
}

二、语雀-分布式

1、有了2阶段提交为什么还需要3阶段提交?

✅有了2阶段提交为什么还需要3阶段提交?

1. XA规范

2. 2PC

3. 3PC

2、分布式锁有几种实现方式?

✅分布式锁有几种实现方式?

1. 基于数据库表

2. 基于缓存

✅Redis实现分布锁的时候,哪些问题需要考虑?

2.1 setnx实现

✅如何用SETNX实现分布式锁?

2.2 redission实现

✅如何用Redisson实现分布式锁?

因为watch dog的续期,是没有次数和时长的限制的,也就是说,如果没有主动解锁,那么他就会一直续期下去。

watchdog解锁失败,不会导致一直续期下去。

3. Zookeeper

✅如何用Zookeeper实现分布式锁?

3、什么是分布式事务?

✅什么是分布式事务?

4、常见的分布式事务有哪些?

✅常见的分布式事务有哪些?

1. 强一致性使用基于XA规范的二阶段及三阶段提交

2. 最终一致性使用基于可靠消息的最终一致性(本地消息表、事务消息)、最大努力通知

3. TCC

4. Seata

5. 如何选择

5、什么是TCC,和2PC有什么区别?

✅什么是TCC,和2PC有什么区别?

1. 与2PC区别

6、如何基于MQ实现分布式事务

✅如何基于MQ实现分布式事务

1. 可靠消息最终一致性

✅如何基于本地消息表实现分布式事务?

✅什么是事务消息,为什么需要事务消息?

2. 最大努力通知

7、如何基于本地消息表实现分布式事务?

项目的奖品发放基于这个。详细见项目的MQ消息。

✅如何基于本地消息表实现分布式事务?

8、什么是最大努力通知?

✅什么是最大努力通知?

9、最大努力通知&事务消息&本地消息表三者区别是什么?

✅最大努力通知&事务消息&本地消息表三者区别是什么?

相关推荐
jstart千语7 小时前
【Git】连接github时的疑难杂症(DNS解析失败)
git·github
fanTuanye10 小时前
Git基本使用(很详细)
git·github
Evenknow10 小时前
将"修改源码"改为更专业的"二次开发",体现技术深度
前端·github
uhakadotcom10 小时前
rAthena:快速入门与基础知识详解,附实用示例代码
面试·架构·github
qianmoQ13 小时前
GitHub 趋势日报 (2025年04月24日)
github
前端太佬17 小时前
从拧螺丝到造火箭:Git高阶玩家生存报告
前端·git·github
前端太佬17 小时前
从青铜到塑料:Git逃难指南(附救命指令大全)
前端·git·github
uhakadotcom20 小时前
跨越速运日调用千万,秒级响应!Flink + OceanBase 实时分析方案全解析
后端·面试·github
uhakadotcom20 小时前
marimo Python笔记本:让Python交互式编程更简单、更可靠
后端·面试·github