2021-10-27 (第6讲 日期算法)

day06 日期算法


Zeller 算法(快速将任意日期转换为星期数):https://www.cnblogs.com/faterazer/p/11393521.html

1. 1185. 一周中的第几天

class Solution {
public:

    bool isLeap(int year)
    {
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) return true;
        return false;
    }

    int w[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    string week[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
    string dayOfTheWeek(int day, int month, int year) {
        //1971-1-1 是周五 week[4];
        //算出距离1971-1-1之间间隔多少(sum)天.
        int sum = 0;
        int y = 1971, m = 1, d = 1;
        while (y < year)
        {
            if (isLeap(y)) sum += 366;
            else sum += 365;
            y ++;
        }
        //cout << y << ' ' << m << ' ' << d << ' ';
        //month, day 距离 m, d多少天
        if (isLeap(year)) w[2] ++; //闰年 2月29天
        while (m <= month)
        {
        	if (m == month && d == day) break; //如果正好 month 和day都相等
            d ++;
            if (d > w[m])
            {
                d = 1;
                m ++;
            }
            sum ++;
        }
        //cout << sum << ' ' << sum % 7;
        return week[(sum + 5) % 7];
    }
};

2. 1154. 一年中的第几天

class Solution {
public:

    bool isLeap(int year)
    {
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) return true;
        return false;
    }

    //将字符转为int
    int change_int(char c, int s)
    {
        return (c - '0') * s;
    }

    int w[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    int dayOfYear(string date) {
        //将data 转为 int日期
        int year = change_int(date[0], 1000) + 
                change_int(date[1], 100) +
                change_int(date[2], 10) +
                change_int(date[3], 1);
        int month = change_int(date[5], 10) + change_int(date[6], 1);
        int day = change_int(date[8], 10) + change_int(date[9], 1);

        if (isLeap(year)) w[2] ++ ;//闰年的2月29天
        int m = 1, d = 1, sum = 1; //月、天、当年的第sum天
        while (m <= month)
        {
            if (m == month && d == day) break;
            d ++;
            if (d > w[m])
            {
                d = 1;
                m ++;
            }
            sum ++;
        }
        return sum;
    }
};

3. 1360. 日期之间隔几天

class Solution {
public:

    bool isLeap(int year)
    {
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) return true;
        return false;
    }

    int w[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    //将字符转为int
    int change_int(char c, int s)
    {
        return (c - '0') * s;
    }

    //将data 转为 int日期
    void change_date(string date, int &year, int &month, int &day)
    {
        
        year = change_int(date[0], 1000) + 
                change_int(date[1], 100) +
                change_int(date[2], 10) +
                change_int(date[3], 1);
        month = change_int(date[5], 10) + change_int(date[6], 1);
        day = change_int(date[8], 10) + change_int(date[9], 1);
    }

    int daysBetweenDates(string date1, string date2) {
        if (date1 > date2) swap(date1, date2); //从date1 ~ date2
        int y1, m1, d1, y2, m2, d2;
        change_date(date1, y1, m1, d1);
        change_date(date2, y2, m2, d2);

        int s = 0; //相隔天数。 //模拟
        while (1)
        {
            if (y1 == y2 && m1 == m2 && d1 == d2) break;
            d1 ++;
            if (isLeap(y1)) w[2] = 29; //闰年2月
            else w[2] = 28;

            if (d1 > w[m1])
            {
                d1 = 1;
                m1 ++;
                if (m1 > 12)
                {
                    m1 = 1;
                    y1 ++;
                }
            }
            s ++;
        }
        return s;
    }
};
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值