算法 — 时间显示

题目描述

小蓝要和朋友合作开发一个时间显示的网站。

在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 19701970 年 11 月 11 日 00:00:0000:00:00 到当前时刻经过的毫秒数。

现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。

给定一个用整数表示的时间,请将这个时间对应的时分秒输出。

输入描述

输入一行包含一个整数,表示时间。

输出描述

输出时分秒表示的当前时间,格式形如 HH:MM:SS,其中 HH 表示时,值为 00​​​​ 到 2323​​​​,MM 表示分,值为 00​​​​ 到 5959​​​,SS 表示秒,值为 00​​ 到 5959​。时、分、秒 不足两位时补前导 00。

样例">输入输出样例

示例一:

输入:

46800999

输出:

13:00:00

示例二:

输入:

1618708103123

输出:

01:08:23

评测用例规模与约定

对于所有评测用例,给定的时间为不超过 10^{18}1018 的正整数。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M

解题思路:

        近期在备赛蓝桥杯,故记录此题。该题其实质是求解系统的一个输入数据作为时间毫秒单位时,该数是从1970年1月1日的00:00到何时,这里只需要输出时:分:秒。此题没有捷径可以走,就是考考生的分类讨论能力。该题较为简单理解,这里只讲一下大概的思路即可。

        在该题目中,首先你要确定具体时间是哪一年,然后再确定是哪一月份,以此类推,再确定是哪一天,哪个小时哪个分钟哪个秒数,剩下的不够一秒的毫秒数可以丢弃不理(该题目的意思是这样)。该算法的Java代码实现如下:

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        long timeNum = scan.nextLong();//输入表示时间
		long averageYearMs = 31536000000l, leapYearMs = 31622400000l, dayMs = 86400000, hourMs = 3600000, minuteMs = 60000, secondMs = 1000;//平年、闰年一年毫秒数3
		int year, month, day, hour, minute, second;
		for (year = 1970; ; year++) {//求最大年份数
			if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {//闰年
				if (timeNum >= leapYearMs) {
					timeNum -= leapYearMs;
					continue;
				}else {
					break;//当前i便是最大年份
				}
			}else {//平年
				if (timeNum >= averageYearMs) {
					timeNum -= averageYearMs;
					continue;
				}else {
					break;//当前i便是最大年份
				}
			}
		}
		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {//闰年,366天
			for (month = 1; month <= 12; month++) {//求最大月份数
				if (month == 1) {
					if (timeNum >= 2678400000l) {
						timeNum -= 2678400000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 2) {
					if (timeNum >= 2505600000l) {
						timeNum -= 2505600000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 3) {
					if (timeNum >= 2678400000l) {
						timeNum -= 2678400000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 4) {
					if (timeNum >= 2592000000l) {
						timeNum -= 2592000000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 5) {
					if (timeNum >= 2678400000l) {
						timeNum -= 2678400000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 6) {
					if (timeNum >= 2592000000l) {
						timeNum -= 2592000000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 7) {
					if (timeNum >= 2678400000l) {
						timeNum -= 2678400000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 8) {
					if (timeNum >= 2678400000l) {
						timeNum -= 2678400000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 9) {
					if (timeNum >= 2592000000l) {
						timeNum -= 2592000000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 10) {
					if (timeNum >= 2678400000l) {
						timeNum -= 2678400000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 11) {
					if (timeNum >= 2592000000l) {
						timeNum -= 2592000000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 12) {
					if (timeNum >= 2678400000l) {
						timeNum -= 2678400000l;
						continue;
					}else {
						break;
					}
				}
			}
			//month为最大月份数
			if (month == 1) {
				for (day = 1; day <= 31; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 2) {
				for (day = 1; day <= 29; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 3) {
				for (day = 1; day <= 31; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 4) {
				for (day = 1; day <= 30; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 5) {
				for (day = 1; day <= 31; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 6) {
				for (day = 1; day <= 30; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 7) {
				for (day = 1; day <= 31; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 8) {
				for (day = 1; day <= 31; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 9) {
				for (day = 1; day <= 30; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 10) {
				for (day = 1; day <= 31; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 11) {
				for (day = 1; day <= 30; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else {
				for (day = 1; day <= 31; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}
			//当前号数为day
			for (hour = 0; hour <= 23; hour++) {//求出当前小时数
				if (timeNum >= hourMs) {
					timeNum -= hourMs;
					continue;
				}else {
					break;
				}
			}
			//hour为当前小时
			for (minute = 0; minute <= 59; minute++) {//求出当前分钟数
				if (timeNum >= minuteMs) {
					timeNum -= minuteMs;
					continue;
				}else {
					break;
				}
			}
			for (second = 0; second <= 59; second++) {//求出当前秒数
				if (timeNum >= secondMs) {
					timeNum -= secondMs;
					continue;
				}else {
					break;
				}
			}
			//显示
			String hours = String.valueOf(hour);
			String minutes = String.valueOf(minute);
			String seconds = String.valueOf(second);
			if (hours.length() == 1) {
				hours = "0" + hours;
			}
			if (minutes.length() == 1) {
				minutes = "0" + minutes;
			}
			if (seconds.length() == 1) {
				seconds = "0" + seconds;
			}
			System.out.println(hours + ":" + minutes + ":" + seconds);
		}else {//平年,365天
			for (month = 1; month <= 12; month++) {//求最大月份数
				if (month == 1) {
					if (timeNum >= 2678400000l) {
						timeNum -= 2678400000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 2) {
					if (timeNum >= 2419200000l) {
						timeNum -= 2505600000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 3) {
					if (timeNum >= 2678400000l) {
						timeNum -= 2678400000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 4) {
					if (timeNum >= 2592000000l) {
						timeNum -= 2592000000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 5) {
					if (timeNum >= 2678400000l) {
						timeNum -= 2678400000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 6) {
					if (timeNum >= 2592000000l) {
						timeNum -= 2592000000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 7) {
					if (timeNum >= 2678400000l) {
						timeNum -= 2678400000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 8) {
					if (timeNum >= 2678400000l) {
						timeNum -= 2678400000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 9) {
					if (timeNum >= 2592000000l) {
						timeNum -= 2592000000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 10) {
					if (timeNum >= 2678400000l) {
						timeNum -= 2678400000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 11) {
					if (timeNum >= 2592000000l) {
						timeNum -= 2592000000l;
						continue;
					}else {
						break;
					}
				}
				if (month == 12) {
					if (timeNum >= 2678400000l) {
						timeNum -= 2678400000l;
						continue;
					}else {
						break;
					}
				}
			}
			//month为最大月份数
			if (month == 1) {
				for (day = 1; day <= 31; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 2) {
				for (day = 1; day <= 28; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 3) {
				for (day = 1; day <= 31; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 4) {
				for (day = 1; day <= 30; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 5) {
				for (day = 1; day <= 31; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 6) {
				for (day = 1; day <= 30; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 7) {
				for (day = 1; day <= 31; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 8) {
				for (day = 1; day <= 31; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 9) {
				for (day = 1; day <= 30; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 10) {
				for (day = 1; day <= 31; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else if (month == 11) {
				for (day = 1; day <= 30; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}else {
				for (day = 1; day <= 31; day++) {//获取 当前 号数
					if (timeNum >= dayMs) {
						timeNum -= dayMs;
						continue;
					}else {
						break;
					}
				}
			}
			//当前号数为day
			for (hour = 0; hour <= 23; hour++) {//求出当前小时数
				if (timeNum >= hourMs) {
					timeNum -= hourMs;
					continue;
				}else {
					break;
				}
			}
			//hour为当前小时
			for (minute = 0; minute <= 59; minute++) {//求出当前分钟数
				if (timeNum >= minuteMs) {
					timeNum -= minuteMs;
					continue;
				}else {
					break;
				}
			}
			for (second = 0; second <= 59; second++) {//求出当前秒数
				if (timeNum >= secondMs) {
					timeNum -= secondMs;
					continue;
				}else {
					break;
				}
			}
			//显示
			String hours = String.valueOf(hour);
			String minutes = String.valueOf(minute);
			String seconds = String.valueOf(second);
			if (hours.length() == 1) {
				hours = "0" + hours;
			}
			if (minutes.length() == 1) {
				minutes = "0" + minutes;
			}
			if (seconds.length() == 1) {
				seconds = "0" + seconds;
			}
			System.out.println(hours + ":" + minutes + ":" + seconds);
		}
        scan.close();
    }
}

        代码确实冗余了些,可以进一步进行简化,这一步是非必要步骤,不简化也可以在训练中提交测试通过,故读者有兴趣的可以自行简化即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值