🔥博客主页: A_SHOWY
🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_
这三天的题目难度相对较小,基本都为模拟题,但是第二三的题目年份贡献类型很有代表性。2023年最后三天年终收尾,正好是周日,下次的每日一题更新新的一年新的一周开始。
【12.29】2706.购买两块巧克力
2706. 购买两块巧克力https://leetcode.cn/problems/buy-two-chocolates/
可以说是睡的最早的一集,就是一个排序后一次遍历的问题,3分钟秒了
class Solution {
public:int buyChoco(vector<int>& 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. 一周中的第几天https://leetcode.cn/problems/day-of-the-week/
虽然是一个简单题,但是并不轻松,是一道稍微复杂的模拟题目,首先要熟悉判断闰年的条件,同时考虑清楚年、月、日的贡献和当年如果是闰年需要多共贡献一天。
首先,我们应该找到一个 baseline,然后将所给的日期,基于这个 baseline 计算偏移量。因为题目所给的日期是在 1971 到 2100 年之间的有效日期,所以我们可以选取1970年12月31日为baseline,这一天是星期四,基于这个日期计算偏移量。
class Solution {
public:string dayOfTheWeek(int day, int month, int year) {vector<string> week = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};vector<int> 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. 一年中的第几天https://leetcode.cn/problems/day-of-the-year/
也是模拟题,有了前一天的铺垫,今天的题目就显得简单的多了,也是通过年月日计算,但是这道题需要掌握复制子串的语句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<int> 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));
同样通过求月份贡献,判断是否闰年,再加上日的贡献返回即可。