写一个算法:
要求:
用户第一行会输入一个时间(包含时分)xx:xx
第二行表示具体操作次数
后面行数为操作次数,可以 为+2,-3等,代表操作了x分钟
写一个算法,计算当前时间,进行操作后时间(包含时分)
1.首先获取时间
用这四行处理输入的时间
用hour接受当前小时,min接受当前分钟
Scanner in = new Scanner(System.in);
String[] time = in.nextLine().split(":");
int hour = Integer.valueOf(time[0]);
int min = Integer.valueOf(time[1]);
获取操作次数
int n = in.nextInt();
2.接下来就开始核心代码
首先本计算不涉及年月日的计算,有两种解题思路:
一、是分钟在加到60时,小时要加一;分钟在减到0后,小时要减一,分钟要变成59,且小时在减到0后,要赋值23。这个方法涉及到的判断和编写代码时,容易出错或存在缺漏。
二、直接将小时和分钟全部转化为总分钟数,在这个基础上进行加减操作:
如果进行减操作,结果是负数,代表一天时间以及不够减了,且有可能减的数不知一天,所以先对24(24小时)*60(60分钟)进行取余,保证最终减操作减到最后在一天之内浮动,在加24*60,将负数转为正数,结果为最终的总分钟数,在转成时分显示即可;
如果进行加操作,结果大于24*60,代表超过了一天,,且有可能超过了不止一天,所以进行取余保证时间永远不超过一天,最终得到了总分钟数,在转成时分显示即可;
二的方法在后续还可以替换成,年月日时分秒计算器操作,因此本文使用第二给方法。
int sum = hour * 60 + min; //计算总分钟数
for(int i = 0 ; i < n ; i++) {
String op = in.next(); //获取当前行
if (op.length() > 1) { //确保当前行有数据
String flag = op.substring(0, 1); //获得符号
Integer opNum = Integer.valueOf(op.substring(1)); //获得计算的值
if (flag.equals("-")) { //减操作
sum -= opNum; //总分钟数减去此次操作的分钟数,若不为负数不需要进行后面操作
if(sum < 0) { //已经变为负数
sum %= 60 * 24; //取余,确保时间不会超过负的一天
sum += 60 * 24; //由时间不存在负数,但当前负数值加上一天的总分钟数就为最终结果
}
}else if (flag.equals("+")) { //加操作
sum += opNum; //加操作,直接取余,减少判断是否超过一天
sum %= 60 * 24;
}
}
}
hour = sum / 60; //得到最终的小时的值
min = sum % 60 //取余结果为分钟的值
3.最后输出结果时需要注意
因为小时和分钟用int接,若结果为凌晨1点9分,输出会变成1:9
所以需要处理,在小时或分钟为个数的情况下,以情况加"0"
因此写了一个函数处理
public static void printTime(int hour, int min){
if (hour < 10 && min < 10){
System.out.println("0" + hour + ":0" + min);
return;
}else if (hour >= 10 && min < 10) {
System.out.println(hour + ":0" + min);
return;
}else if (min >= 10 && hour < 10) {
System.out.println("0" + hour + ":" + min);
return;
}
System.out.println(hour + ":" + min);
}
4.完整代码
public static void main(String[] args) {
String[] time = in.nextLine().split(":");
int hour = Integer.valueOf(time[0]);
int min = Integer.valueOf(time[1]);
int n = in.nextInt();
int sum = hour * 60 + min; //计算总分钟数
for(int i = 0 ; i < n ; i++) {
String op = in.next(); //获取当前行
if (op.length() > 1) { //确保当前行有数据
String flag = op.substring(0, 1); //获得符号
Integer opNum = Integer.valueOf(op.substring(1)); //获得计算的值
if (flag.equals("-")) { //减操作
sum -= opNum; //总分钟数减去此次操作的分钟数,若不为负数不需要进行后面操作
if(sum < 0) { //已经变为负数
sum %= 60 * 24; //取余,确保时间不会超过负的一天
sum += 60 * 24; //由时间不存在负数,但当前负数值加上一天的总分钟数就为最终结果
}
}else if (flag.equals("+")) { //加操作
sum += opNum; //加操作,直接取余,减少判断是否超过一天
sum %= 60 * 24;
}
}
}
hour = sum / 60; //得到最终的小时的值
min = sum % 60 //取余结果为分钟的值
printTime(hour, min);
}
public static void printTime(int hour, int min){
if (hour < 10 && min < 10){
System.out.println("0" + hour + ":0" + min);
return;
}else if (hour >= 10 && min < 10) {
System.out.println(hour + ":0" + min);
return;
}else if (min >= 10 && hour < 10) {
System.out.println("0" + hour + ":" + min);
return;
}
System.out.println(hour + ":" + min);
}
注意:
若需要修改成其他时间类型的计算,更改总数sum和取余时和加减操作时的计算结果,且将输出方法更改即可。