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

文章目录

题目

1154. 一年中的第几天链接

思路

题目要求是给定一个字符串 date,它代表一个日期,采用标准的 YYYY-MM-DD 格式。需要计算这个日期是当年的第几天。

首先,我们可以通过字符串的索引来提取年、月和日的数值,并将其转换为整数,例如:

c++ 复制代码
int year = (date[0] - '0') * 1000 + (date[1] - '0') * 100 + (date[2] - '0') * 10 + (date[3] - '0');
int month = (date[5] - '0') * 10 + (date[6] - '0');
int day = (date[8] - '0') * 10 + (date[9] - '0');

接下来,可以利用月份的信息和闰年的判断,逐个累加每个月的天数,计算给定日期在当年的第几天。这个过程可以优化,无需逐个判断每个月的天数,可以通过数组预先存储每个月的天数信息:

c++ 复制代码
int daysInMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

这个数组的索引代表月份,数组的值代表该月的天数。然后利用闰年的条件,对二月的天数进行修改:

cpp 复制代码
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {
    daysInMonth[2] = 29; // 闰年二月有29天
}

最后,利用循环累加到给定日期的前一个月,将当月的天数加上,即可得到该日期是当年的第几天:

cpp 复制代码
int totalDays = 0;
for (int i = 1; i < month; ++i) {
    totalDays += daysInMonth[i];
}
totalDays += day; // 加上当前月的天数

将得到的 totalDays 返回即可。

代码

c++ 复制代码
class Solution {
public:
    int dayOfYear(string date) {
        for(int i=0;i<date.size();++i)cout<<i<<' '<<date[i]<<endl;
        int nianfen=(date[0]-'0')*1000+(date[1]-'0')*100+(date[2]-'0')*10+(date[3]-'0');
        int yuefen=(date[5]-'0')*10+(date[6]-'0');
        int riqi=(date[8]-'0')*10+(date[9]-'0');
        //cout<<nianfen<<' '<<yuefen<<' '<<riqi;
        if(yuefen>1)riqi+=31;
        if(yuefen>2&&(nianfen%400==0||(nianfen%4==0&&nianfen%100!=0)))riqi+=29;
        else if(yuefen>2)riqi+=28;
        if(yuefen>3)riqi+=31;
        if(yuefen>4)riqi+=30;
        if(yuefen>5)riqi+=31;
        if(yuefen>6)riqi+=30;
        if(yuefen>7)riqi+=31;
        if(yuefen>8)riqi+=31;
        if(yuefen>9)riqi+=30;
        if(yuefen>10)riqi+=31;
        if(yuefen>11)riqi+=30;
        return riqi;
        
    }
};
相关推荐
YuTaoShao8 分钟前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
Heartoxx10 分钟前
c语言-指针(数组)练习2
c语言·数据结构·算法
大熊背24 分钟前
图像处理专业书籍以及网络资源总结
人工智能·算法·microsoft
满分观察网友z28 分钟前
别怕树!一层一层剥开它的心:用BFS/DFS优雅计算层平均值(637. 二叉树的层平均值)
算法
江理不变情30 分钟前
图像质量对比感悟
c++·人工智能
apocelipes1 小时前
记一次ADL导致的C++代码编译错误
c++·开发工具和环境
杰克尼2 小时前
1. 两数之和 (leetcode)
数据结构·算法·leetcode
YuTaoShao2 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
Code Warrior2 小时前
【每日算法】专题五_位运算
开发语言·c++
二进制person6 小时前
Java SE--方法的使用
java·开发语言·算法