这是小川的第410次更新,第442篇原创

看题和准备

今天介绍的是LeetCode算法题中Easy级别的第261题(顺位题号是1154)。给定表示格式为YYYY-MM-DD的公历日期的字符串日期,返回该日期在年份中的编号。例如:

输入:date ="2019-01-09"

输出:9

说明:给定日期是2019年的第9天。

输入:date ="2019-02-10"

输出:41

输入:date ="2003-03-01"

输出:60

输入:date ="2004-03-01"

输出:61

注意

  • date.length = 10

  • date[4] == date[7] == '-',所有其他date[i]都是数字

  • 日期表示1900年1月1日至2019年12月31日之间的日历日期。

第一种解法

题目的意思是计算给的日期在年份中的天数,年份分平年、闰年,月份分大月、小月,直接对日期字符串进行截取,转为对应的年月日数字。针对年份的处理,如果是闰年,则2月有29天,针对月份的处理,判断月份,然后累加对应的天数即可。

public int dayOfYear(String date) {
int year = Integer.parseInt(date.substring(0, 4));
int month = Integer.parseInt(date.substring(5, 7));
int day = Integer.parseInt(date.substring(8, 10));
switch (month) {
case 12:
day += 30;
case 11:
day += 31;
case 10:
day += 30;
case 9:
day += 31;
case 8:
day += 31;
case 7:
day += 30;
case 6:
day += 31;
case 5:
day += 30;
case 4:
day += 31;
case 3:
day += 28;
if (isLeapYear(year)) {
day++;
}
case 2:
day += 31;
}
return day;
} /**
* 判断当前年份是否为闰年
* @param year
* @return
*/
public boolean isLeapYear(int year) {
// 普通闰年,能被4整除,但是后两位不以00结尾
if (year%4 == 0 && year%100 != 0) {
return true;
}
// 世纪闰年,后两位以00结尾,且能被400整除
if (year%100 == 0 && year%400 == 0) {
return true;
}
return false;
}

第二种解法

针对第一种解法中的switch语句,我们可以用数组进行替代,可以减少代码量。以月份为索引,天数为value,使用循环来处理天数,至于闰年的判断则不变。

public int dayOfYear2(String date) {
int[] arr = {31,28,31,30,31,30,31,31,30,31,30,31};
int year = Integer.parseInt(date.substring(0, 4));
int month = Integer.parseInt(date.substring(5, 7));
int day = Integer.parseInt(date.substring(8, 10));
for (int i=0; i<month-1; i++) {
day += arr[i];
}
return isLeapYear(year) && month >= 3 ? day+1 : day;
} /**
* 判断当前年份是否为闰年
* @param year
* @return
*/
public boolean isLeapYear(int year) {
// 普通闰年,能被4整除,但是后两位不以00结尾
if (year%4 == 0 && year%100 != 0) {
return true;
}
// 世纪闰年,后两位以00结尾,且能被400整除
if (year%100 == 0 && year%400 == 0) {
return true;
}
return false;
}

第三种解法

既然我们已经知道了每一个月有多少天,那么我们可以直接将依次累计的天数放入数组中,月份减1为数组索引。

创建一个长度为13的数组,第一项为0,因为一月可以直接获取天数显示即可,第二项为31天,因为二月的天数需要加上一月的31天,依次往后计算,此数组中的月份累计天数以平年为基础。如果当前年份是闰年,并且月份大于2月,则需要在计算结果上多加一天。

public int dayOfYear3(String date) {
int[] arr = {0,31,59,90,120,151,181,212,243,273,304,334,365};
int year = Integer.parseInt(date.substring(0, 4));
int month = Integer.parseInt(date.substring(5, 7));
int day = Integer.parseInt(date.substring(8, 10));
if (isLeapYear(year) && month >= 3) {
return arr[month-1]+day+1;
}
return arr[month-1]+day;
} /**
* 判断当前年份是否为闰年
* @param year
* @return
*/
public boolean isLeapYear(int year) {
// 普通闰年,能被4整除,但是后两位不以00结尾
if (year%4 == 0 && year%100 != 0) {
return true;
}
// 世纪闰年,后两位以00结尾,且能被400整除
if (year%100 == 0 && year%400 == 0) {
return true;
}
return false;
}

小结

算法专题目前已更新LeetCode算法题文章267+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode.1154-一年中的第几天(Day of the Year)的更多相关文章

  1. LeetCode 1154. 一年中的第几天

    给你一个按 YYYY-MM-DD 格式表示日期的字符串 date,请你计算并返回该日期是当年的第几天. 通常情况下,我们认为 1 月 1 日是每年的第 1 天,1 月 2 日是每年的第 2 天,依此类 ...

  2. 【LeetCode】1154. Day of the Year 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 计算1月1号之间天数 日期 题目地址:https:// ...

  3. 【leetcode】1154. Day of the Year

    题目如下: Given a string date representing a Gregorian calendar date formatted as YYYY-MM-DD, return the ...

  4. 【Leetcode周赛】从contest-121开始。(一般是10个contest写一篇文章)

    Contest 121 (题号981-984)(2019年1月27日) 链接:https://leetcode.com/contest/weekly-contest-121 总结:2019年2月22日 ...

  5. mysql学习 | LeetCode数据库简单查询练习

    力扣:https://leetcode-cn.com/ 力扣网数据库练习:https://leetcode-cn.com/problemset/database/ 文章目录 175. 组合两个表 题解 ...

  6. 我为什么要写LeetCode的博客?

    # 增强学习成果 有一个研究成果,在学习中传授他人知识和讨论是最高效的做法,而看书则是最低效的做法(具体研究成果没找到地址).我写LeetCode博客主要目的是增强学习成果.当然,我也想出名,然而不知 ...

  7. LeetCode All in One 题目讲解汇总(持续更新中...)

    终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 477 Total Hamming Distance ...

  8. [LeetCode] Longest Substring with At Least K Repeating Characters 至少有K个重复字符的最长子字符串

    Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...

  9. Leetcode 笔记 113 - Path Sum II

    题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...

随机推荐

  1. PAM安全认证模块

  2. pycharm图像不能显示,之前是可以显示的。显示一两次突然不显示了

    网上说是什么包问题的就说了.我遇到一个非常奇葩的问题 因为你的设置可能是这样 每次都在窗口右侧的工具栏那边显示.可能突然心情不佳就不显示了.然后你再把勾去掉即可.你要喜欢再点上也行.

  3. pycharm pro版server激活

    从网上搜集了一些 License server 地址(有钱的一定要支持正版哦) http://idea.iteblog.com/key.php http://intellij.mandroid.cn ...

  4. 转:ubuntu添加用户adduser,并给予sudo权限

    ubuntu添加用户adduser,并给予sudo权限 如何创建ubuntu新用户? 首先打开终端,输入:sudo adduser username正在添加用户“username”... 正在添加新组 ...

  5. ESP8266—“ICACHE_FLASH_ATTR”宏

    问:ESP8266_NONOS_SDK中ICACHE_FLASH_ATTR宏的用途是什么?我看到它取决于ICACHE_FLASH,但我不知道何时应该定义该符号.什么时候需要包括它?答:对于ESP826 ...

  6. nginx.conf文件的使用

    默认配置语法 全局---服务级别的配置 user 设置nginx服务的系统使用用户,基本上不用动 worker_processes 工作进程数---跟nginx多worker有关,增大连接数的并发处理 ...

  7. 《剑指offer》算法题第八天

    今日题目(对应书上第39~42题): 数组中出现次数超过一半的数字 最小的k个数(top k,重点!) 数据流中的中位数 连续子数组的最大和 今天的题目都比较经典,特别是第2题. 1. 数组中出现次数 ...

  8. luoguP3373 【模板】线段树 2

    P3373 [模板]线段树 2 969通过 3.9K提交 题目提供者 HansBug 标签 云端↑ 难度 提高+/省选- 时空限制 1s / 128MB 题目描述 如题,已知一个数列,你需要进行下面两 ...

  9. [笔记]共享内存(shm)

    一.特点 共享内存允许多个不同的进程可以访问同一块内存.相较于其他IPC形式,具有速度快,效率高的特点,共享内存的存在降低了在大规模数据处理过程中内存的消耗. 二.创建共享内存 1.头文件 #incl ...

  10. Angular5.0之 安装指定版本Angular CLI

    我们可能会发现按照网上的方式下载安装后,使用Angular CLI生成的项目并不是我们想要的Angular的版本,因为在我们没有指定安装版本的前提下,默认会下载最新的版本安装,然而不同的Angular ...