【每日一题】【12.29】 - 【12.31】年终收尾

博客主页: A_SHOWY
系列专栏:力扣刷题总结录 数据结构  云计算  数字图像处理  力扣每日一题_

这三天的题目难度相对较小,基本都为模拟题,但是第二三的题目年份贡献类型很有代表性。2023年最后三天年终收尾,正好是周日,下次的每日一题更新新的一年新的一周开始。

【12.29】2706.购买两块巧克力 

2706. 购买两块巧克力icon-default.png?t=N7T8https://leetcode.cn/problems/buy-two-chocolates/ 【每日一题】【12.29】 - 【12.31】年终收尾_第1张图片

可以说是睡的最早的一集,就是一个排序后一次遍历的问题,3分钟秒了 

class Solution {
public:
    int buyChoco(vector& prices, int money) {
        sort(prices.begin(),prices.end());
        int ans = 0;
        for(int i = 0 ; i < 2;i ++){
           ans += prices[i];
        }
        if(ans <= money) return (money - ans);
        else return money;
    }
};

【12.30】 1185.一周中的第几天

1185. 一周中的第几天icon-default.png?t=N7T8https://leetcode.cn/problems/day-of-the-week/

【每日一题】【12.29】 - 【12.31】年终收尾_第2张图片 

虽然是一个简单题,但是并不轻松,是一道稍微复杂的模拟题目,首先要熟悉判断闰年的条件,同时考虑清楚年、月、日的贡献和当年如果是闰年需要多共贡献一天。 

首先,我们应该找到一个 baseline,然后将所给的日期,基于这个 baseline 计算偏移量。因为题目所给的日期是在 1971 到 2100 年之间的有效日期,所以我们可以选取1970年12月31日为baseline,这一天是星期四,基于这个日期计算偏移量。

class Solution {
public:
    string dayOfTheWeek(int day, int month, int year) {
     vector week = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
     vector monthdays = {31,28,31,30,31,30,31,31,30,31,30,};
     //年份的贡献
     int days = 365*(year - 1 - 1970);
     for(int i = 1971; i < year;i++){
         if(i % 400 == 0 || (i % 4 == 0 &&i % 100 != 0)) days += 1;
     }
     //判断是否闰年
     if(month > 2 && (year % 400 == 0 || (year % 4 == 0 &&year % 100 != 0))) days +=1;
     //月份贡献
     for(int i = 0; i < month-1; i++){
         days += monthdays[i];
     }
     //天贡献
     days += day;
     
    return week[(days + 3) % 7];
    }
};

 判断闰年的条件:能被400整除或者能被4整除但不能被400整除。

i % 400 == 0 || (i % 4 == 0 &&i % 100 != 0)

在判断年的贡献的时候year要先减去1,因为不算今年的,今年的在后月份和天数的时候另算

int days = 365*(year - 1 - 1970);

判断完年份以后,要判断当年是不是闰年且大于2月份,如果是闰年加1,最后返回的时候由于1970年12月31日是星期4,可以假设1971年1月1日是星期5,是days是1,对应Tuesday而对应应该是Friday,所以加三再除以7取模。

   return week[(days + 3) % 7];

【12.31】1154.一年中的第几天 

1154. 一年中的第几天icon-default.png?t=N7T8https://leetcode.cn/problems/day-of-the-year/

 【每日一题】【12.29】 - 【12.31】年终收尾_第3张图片

也是模拟题,有了前一天的铺垫,今天的题目就显得简单的多了,也是通过年月日计算,但是这道题需要掌握复制子串的语句substr。

class Solution {
public:
    int dayOfYear(string date) {
    //复制子串
    int year = stoi(date.substr(0,4));
    int month = stoi(date.substr(5,2));
    int day = stoi(date.substr(8,2));
     vector monthdays = {31,28,31,30,31,30,31,31,30,31,30};
     int days = 0;
     for(int i = 0; i < month - 1; i++){
          days += monthdays[i];
     }
     if(year % 400 == 0 ||(year % 4 == 0 && year % 100 != 0))
     {
         if(month > 2) days += 1;
     }
     days += day;
     return days;
    }
};

通过复制子串的操作求出年月日 ,第一个参数表示从几开始,第二个参数表示长度

 int year = stoi(date.substr(0,4));
    int month = stoi(date.substr(5,2));
    int day = stoi(date.substr(8,2));

同样通过求月份贡献,判断是否闰年,再加上日的贡献返回即可。

你可能感兴趣的:(力扣每日一题,算法,leetcode,数据结构,c++)