maskcrafter-1.1靶机渗透复盘:信息收集到权限提升全链路
2026/11/3 11:45:14
算法原理:
解法:计算区间交集
0ms击败100.00%
时间复杂度O(1)
将字符串的日期转换成在这一年的第几天,那么问题就相当于求两个区间交集中的整数个数
好比 [10,30] 与 [20,40] 的交集为 [20,30],区间内的整数个数为 30-20+1==11
计算左右端点:
left:两区间左端点最大值
right:两区间右端点最小值
交集中的个数为 right-left+1
当交集为空时,答案为0,用最大值去取值,避免出现负数
class Solution { //2409. 统计共同度过的日子数 private static final int[] daysPreSum=new int[]{0,31,59,90,120,151,181,212,243,273,304,334,365}; public int countDaysTogether(String arriveAlice, String leaveAlice, String arriveBob, String leaveBob) { //重叠区间的起点 int left=calcDays(arriveAlice.compareTo(arriveBob)>0?arriveAlice:arriveBob); int right=calcDays(leaveAlice.compareTo(leaveBob)<0?leaveAlice:leaveBob); //结果不能为负数 return Math.max(right-left+1,0); } private int calcDays(String S){ char[] s=S.toCharArray(); //取出月份:s[0]s[1]是月 int month=(s[0]-'0')*10+s[1]-'0'; //取出日期:s[3]s[4]是日,跳过中间的s[2]="-" int day=(s[3]-'0')*10+s[4]-'0'; //daysPreSum[month-1]:前面(month-1)个月一共多少天,再加上当月的day return daysPreSum[month-1]+day; } }