题解《算法零基础100讲》(第6讲) 日期算法(java版)
Posted 敲代码的xiaolang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解《算法零基础100讲》(第6讲) 日期算法(java版)相关的知识,希望对你有一定的参考价值。
算法小白欢迎加入此社区:https://bbs.csdn.net/forums/hero?category=0
由英雄大佬带领的抱团学算法队伍,从0开始,期待你的加入。
本博文是对此文章习题所作的题解,如有不足,请多指教:
https://blog.csdn.net/WhereIsHeroFrom/article/details/120875184
本文涉及对闰年的处理,对一年中日期对应天数的处理,笔者曾写过一个比较简单的C语言版本的,可以供大家参考:https://blog.csdn.net/weixin_52605156/article/details/117821191
第一题:
链接:https://leetcode-cn.com/problems/day-of-the-week/
题目分析:
关键在于需要查找得到1971年1月1日是星期五。
然后分析题目,起码需要有对闰年的处理,需要考虑输入的日期与我们起始日期,也就是1971年1月1日的关系。
具体分析步骤在代码中注释,这里简单写一下思路:
先用数组处理每个月的天数,先考虑平年,然后再考虑闰年的时候,对天数进行特殊的考虑,然后在对对应星期几处理的时候,应当分析所定义的数组与你所求的天数对7取余的关系。
class Solution {
public String dayOfTheWeek(int day, int month, int year) {
/*先定义一个数组去承接平年的时候的每一个月的天数*/
int[] array=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
int i;
/*先由你输入的月份,确定存入的天数*/
for(i = 1; i < month; i++){
day = day + array[i];
}
/*定义一个变量去承接闰年,如果是1,那么是闰年,是0,则为平年*/
int runnian = 0;
if(year%4==0&&year%100!=0||year%400==0){
runnian=1;
}
int days=0;/*定义新的变量去承接天数*/
if(runnian == 1){
if(runnian == 1&&month > 2){
days = day + 1; /*如果是闰年,并且月份比2月大,我们再加一*/
}
if(runnian==1&&month<=2)
{
days=day;
}
}
if(runnian==0)
{
days=day;
}
int num;
num = (year - 1971)*365 + days;
/*求你输入的年月日距离1971年有多少年,先都当作平年计算*/
int number = 0,j;
for(j = 1971; j < year; j++){
/*再次遍历,求出里面的闰年的个数,用number去承接*/
if(j%4==0&&j%100!=0||j%400==0){
number++;
}
}
num = num + number +6;
/*因为1971年1月1日是周五,所以我们定义的数组起始也定义为周五
那么为什么要 num = num + number +6;
因为我们 Friday 是第一个元素,我们再补充给它6个元素,那么它就正好形成一个循环,方便我们进行取余操作
*/
String[] weeks = new String[]{"Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday"};
int w = ((num)%7);
return weeks[w];
}
}
第二题:
链接:https://leetcode-cn.com/problems/day-of-the-year/
题目分析:
跟笔者文前放置的C语言版本类似,先把天数存入到一个数组里面,然后取出所输入的字符串的对应位数,如果是闰年,再进行相应的操作。
class Solution {
public int dayOfYear(String date) {
int []array = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
int year=0,month=0,day=0,count=0;
int i;
year=Integer.parseInt(date.substring(0,4));
month=Integer.parseInt(date.substring(5,7));
day=Integer.parseInt(date.substring(8,10));
if(year%4==0&&year%100!=0||year%400==0){
array[2]=29;
}
for(i=1; i<month; i++){
count = count + array[i];
}
count = count + day;
return count;
}
}
第三题:
链接:https://leetcode-cn.com/problems/number-of-days-between-two-dates/
题目分析:
跟第二题一样,使用两个数组,只不过加上了一个对年的判断,然后求出两组数之后,再进行相减。
class Solution {
public int daysBetweenDates(String date1, String date2) {
/*使用两个数组,都先定义成平年的类型*/
int []array = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
int []array1 = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
int year=0,year1=0,month=0,month1=0,day=0,day1=0,count=0,count1=0;
int i;
/*取相应的位数进行运算*/
year=Integer.parseInt(date1.substring(0,4));
year1=Integer.parseInt(date2.substring(0,4));
month=Integer.parseInt(date1.substring(5,7));
month1=Integer.parseInt(date2.substring(5,7));
day=Integer.parseInt(date1.substring(8,10));
day1=Integer.parseInt(date2.substring(8,10));
/*如果是闰年,我就把二月的部分改成29*/
if(year%4==0&&year%100!=0||year%400==0){
array[2]=29;
}
if((year1%4==0&&year1%100!=0)||year1%400==0){
array1[2]=29;
}
/*对年数的操作*/
for(i=1971; i<year; i++){
if(i%4==0&&i%100!=0||i%400==0){
count = count + 366;
}else{
count = count + 365;
}
}
for(i=1; i<month; i++){
count = count + array[i];
}
count = count + day;
for(i=1971; i<year1; i++){
if(i%4==0&&i%100!=0||i%400==0){
count1 = count1 + 366;
}else{
count1 =count1 + 365;
}
}
for(i=1;i<month1;i++){
count1 = count1 + array1[i];
}
count1 =count1 + day1;
/*进行做差比较*/
return Math.abs(count-count1);
}
}
有问题欢迎留言,欢迎加入“万人千题”社区,在这里一起努力。
以上是关于题解《算法零基础100讲》(第6讲) 日期算法(java版)的主要内容,如果未能解决你的问题,请参考以下文章
题解《算法零基础100讲》(第7讲---丑数) (java版)
题解《算法零基础100讲》(第17讲) 线性枚举 - 最值算法(java版)
题解《算法零基础100讲》(第26讲) 字符串算法 - 回文串(java版)
题解《算法零基础100讲》(第8讲) 素数筛选(java版)