Leetcode每日一题 —— 2409. 统计共同度过的日子数

魔法师 2026-10-24 08:04 1



思路


简单题简单做,朴素思路,直接换算成一年中的第几天,然后就好算了。


代码


class Solution {
private static final int[] days = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
public int countDaysTogether(String arriveAlice, String leaveAlice, String arriveBob, String leaveBob) {
int arriveA = dayInYear(arriveAlice);
int leaveA = dayInYear(leaveAlice);
int arriveB = dayInYear(arriveBob);
int leaveB = dayInYear(leaveBob);
int ans = Math.min(leaveA, leaveB) - Math.max(arriveA, arriveB) + 1;
return ans > 0 ? ans : 0;
}
private int dayInYear(String day) {
int m = Integer.parseInt(day.substring(0, 2));
int d = Integer.parseInt(day.substring(3, 5));
int res = 0;
for (int i = 0; i < m - 1; i++) {
res += days[i];
}
res += d;
return res;
}
}
最新回复 (11)
  • 0wFF 10-24 08:05
    1楼

    这么早的吗w

  • qidor 10-24 08:07
    2楼

    早上好啊,顶一下。

  • tommyjin 10-24 08:11
    3楼

    求点难题,这也太水了

  • 迷渡 10-24 08:56
    4楼

    现在 codex 和其他各种 ai 刷题是不是毫无障碍了

  • Lvvvv 10-24 09:53
    5楼

    简单题


    class Solution {
    public:
    int countDaysTogether(string arriveAlice, string leaveAlice, string arriveBob, string leaveBob) {
    vector<int> mon_day = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    for(int i = 1; i < mon_day.size(); i++) {
    mon_day[i] += mon_day[i - 1];
    }
    auto getval = [&mon_day](string s) -> int {
    int mon = (s[0] - '0') * 10 + s[1] - '0';
    int day = (s[3] - '0') * 10 + s[4] - '0';
    return mon_day[mon - 1] + day;
    };
    int al = getval(arriveAlice), ar = getval(leaveAlice);
    int bl = getval(arriveBob), br = getval(leaveBob);
    int interl = max(al,bl), interr = min(ar,br);
    return max(0,interr - interl + 1);
    }
    };
  • SomeBottle 10-24 10:05
    6楼

    全转换为天数再计算区间交叠。


    class Solution {
    public:
    int countDaysTogether(string arriveAlice, string leaveAlice, string arriveBob, string leaveBob) {
    // 本质天数计算题
    // 先生成前缀和
    int days[]={31,59,90,120,151,181,212,243,273,304,334,365};
    // 先全转换为天数
    auto toDays=[&](string& arrive)->int {
    int arriveMonth=stoi(arrive.substr(0,2));
    int arriveDay=stoi(arrive.substr(3));
    if(arriveMonth>1){
    arriveDay+=days[arriveMonth-2];
    }
    return arriveDay;
    };
    int arriveA=toDays(arriveAlice),leaveA=toDays(leaveAlice);
    int arriveB=toDays(arriveBob),leaveB=toDays(leaveBob);
    if(arriveB>=arriveA&&arriveB<=leaveA){
    return min(leaveA,leaveB)-arriveB+1;
    }else if(leaveB>=arriveA&&leaveB<=leaveA){
    return leaveB-max(arriveA,arriveB)+1;
    }else if(arriveA>=arriveB&&arriveA<=leaveB){
    return min(leaveA,leaveB)-arriveA+1;
    }else if(leaveA>=arriveB&&leaveA<=leaveB){
    return leaveA-max(arriveA,arriveB)+1;
    }
    return 0;
    }
    };

    好像写复杂了,用 Go 重新写了一下:


    func countDaysTogether(arriveAlice string, leaveAlice string, arriveBob string, leaveBob string) int {
    // 本质天数计算题
    // 先生成前缀和
    days:=[]int{31,59,90,120,151,181,212,243,273,304,334,365}
    // 先全转换为天数
    toDays:=func(arrive string) int {
    arriveMonth,_:=strconv.Atoi(arrive[:2])
    arriveDay,_:=strconv.Atoi(arrive[3:])
    if arriveMonth>1 {
    arriveDay+=days[arriveMonth-2]
    }
    return arriveDay
    }
    arriveA,leaveA:=toDays(arriveAlice),toDays(leaveAlice)
    arriveB,leaveB:=toDays(arriveBob),toDays(leaveBob)
    return max(0,min(leaveA,leaveB)-max(arriveA,arriveB)+1);
    }
  • tiansuohaoer 10-24 10:07
    7楼

    模拟题


    const int p[13]{0,0,31,59,90,120,151,181,212,243,273,304,334};
    class Solution {
    public:
    int get(string s){
    return p[stoi(s.substr(0,2))]+stoi(s.substr(3));
    }
    int countDaysTogether(string a1, string a2, string b1, string b2) {
    return max(0,min(get(a2),get(b2))-max(get(a1),get(b1))+1);
    }
    };
  • 宙读之魔术士 10-24 11:36
    8楼

    Kotlin每日重拳出击(前缀和+字符串比较):


    class Solution {
    companion object {
    val PREFIX_SUMS = intArrayOf(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
    .runningFold(0, Int::plus)
    }

    fun countDaysTogether(arriveAlice: String, leaveAlice: String, arriveBob: String, leaveBob: String): Int {
    val maxArriveDay = getDayByDate(maxOf(arriveAlice, arriveBob))
    val minLeaveDay = getDayByDate(minOf(leaveAlice, leaveBob))
    return maxOf(minLeaveDay - maxArriveDay + 1, 0)
    }

    private fun getDayByDate(date: String): Int {
    return PREFIX_SUMS[(date[0] - '0') * 10 + (date[1] - '1')] + (date[3] - '0') * 10 + (date[4] - '0')
    }
    }
  • 咪帕 10-24 13:25
    9楼

    朴素解法


    class Solution {
    public:
    int countDaysTogether(string arriveAlice, string leaveAlice, string arriveBob, string leaveBob) {
    vector<int> days {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    auto date2days = [&](const string& s) -> int {
    int m = stoi(s.substr(0, 2));
    int d = stoi(s.substr(3, 2));
    return accumulate(days.begin(), days.begin() + m - 1, d);
    };
    pair<int, int> a = {date2days(arriveAlice), date2days(leaveAlice)};
    pair<int, int> b = {date2days(arriveBob), date2days(leaveBob)};
    if (a.first > b.first) swap(a, b);
    if (a.second < b.first) return 0;
    return min(a.second, b.second) - b.first + 1;
    }
    };
  • Qiansui 10-24 13:35
    10楼

    注意下标捏~


    class Solution {
    public:
    pair<int, int> parse_string(string ss){
    int m = stoi(ss.substr(0, 2)), d = stoi(ss.substr(3, 2));
    return {m, d};
    }

    int countDaysTogether(string arriveAlice, string leaveAlice, string arriveBob, string leaveBob) {
    int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    pair<int, int> aa = parse_string(arriveAlice), la = parse_string(leaveAlice), ab = parse_string(arriveBob), lb = parse_string(leaveBob);
    pair<int, int> st = max(aa, ab), ed = min(la, lb);
    int ans = 0;
    if(st <= ed)
    for(int m = st.first; m <= ed.first; ++ m){
    ans += days[m];
    if(m == st.first) ans -= st.second - 1;
    if(m == ed.first) ans -= days[m] - ed.second;
    }
    return ans;
    }
    };
  • CPython 10-25 16:15
    11楼

    来补题啦佬友


    class Solution:
    def countDaysTogether(self, arriveAlice: str, leaveAlice: str, arriveBob: str, leaveBob: str) -> int:
    m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    dd = [0] * 13
    for i in range(1, 13):
    dd[i] += dd[i-1] + m[i-1]
    # dd = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]

    def cc(s):
    mo = int(s[:2])
    da = int(s[3:])
    return dd[mo-1] + da

    aa, ab, la, lb = cc(arriveAlice), cc(arriveBob), cc(leaveAlice), cc(leaveBob)
    if la < ab or lb < aa:
    return 0
    return min(la, lb) - max(aa, ab) + 1
* 帖子来源Linux.do
返回