一、力扣
1、最长重复子数组

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

思路:当出现两个数相等后,删除第一个数,继续下一个
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 个一组翻转链表

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 的子数组

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、最大数

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、合并区间

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、用最少数量的箭引爆气球

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、无重叠区间

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阶段提交?

1. XA规范

2. 2PC


3. 3PC


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


1. 基于数据库表


2. 基于缓存
2.1 setnx实现



2.2 redission实现

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

3、什么是分布式事务?

4、常见的分布式事务有哪些?
1. 强一致性使用基于XA规范的二阶段及三阶段提交

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

3. TCC

4. Seata

5. 如何选择

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



1. 与2PC区别


6、如何基于MQ实现分布式事务
1. 可靠消息最终一致性



2. 最大努力通知

7、如何基于本地消息表实现分布式事务?
项目的奖品发放基于这个。详细见项目的MQ消息。


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


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

