华为机试-073-简单-HJ73.计算日期到天数转换
一、描述
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
进阶:时间复杂度:O(n) ,空间复杂度:O(1)
1.1、输入描述
输入一行,每行空格分割,分别是年,月,日
1.2、输出描述
输出是这一年的第几天
二、示例
2.1、示例1
输入:
2012 12 31
输出:
366
2.2、示例2
输入:
1982 3 4
输出:
63
三、答案(java)
3.1、方法一
使用Calendar类计算
package com.tzq.hwod;
import java.util.Calendar;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int y = in.nextInt();
int m = in.nextInt();
int d = in.nextInt();
Calendar c1 = Calendar.getInstance();// 实例化
c1.set(y, m - 1, d);// 注意月份从0开始
System.out.println(c1.get(Calendar.DAY_OF_YEAR));
}
}
四、答案(python 3)
- 题目分析
- 题目给出我们年、月、日的信息
- 题目希望我们输出这个年月日对应在该年份中是第几天
4.1、方法一:调用datetime库
- 实现思路
- datetime库中的strftime方法支持以天数的方式输出
- 其中日期格式化符号%j就是天数表示
- 但是这样输出的结果是从001到366为止的字符串
- 我们还要从左边去掉所有的0才是最终的结果
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import datetime
while True:
try:
y,m,d = map(int, input().split())
d = datetime.date(y, m, d) # 录入日期
print(d.strftime("%j").lstrip("0")) # 指定输出一年内的天数并且去掉左边的0
except:
break
复杂度分析
时间复杂度:O(1),对于某个固定的年份和月日时期,计算的代价很小,常量级别的时间代价就可以解决问题
空间复杂度:O(1),只引入了常量级别的空间代价
4.2、方法二:平闰年区别计算
- 实现思路
- 我们知道闰年的二月份是29天,平年的二月份是28天
- 因此在计算某个日子是多少天的时候,要根据平年闰年的不同进行分类塔伦
- 知道这一点后加和所有的天数即可
#!/usr/bin/python
# -*- coding: UTF-8 -*-
while True:
try:
y, m, d = map(int, input().split())
month = [31, 28, 31, 30, 31, 30, 31, 31,30, 31, 30, 31] # 平年的月份
if y % 400 == 0 or (y % 100 != 0 and y % 4 == 0):
month[1] = 29 # 闰年的月份
print(sum(month[:m-1]) + d) # 统计时间
except:
break
复杂度分析
时间复杂度:O(1),对于某个固定的年份和月日时期,计算的代价很小,常量级别的时间代价就可以解决问题
空间复杂度:O(1),只引入了常量级别的空间代价