[蓝桥杯2018初赛]航班时间(java版本)

这题又是我不会的题,从一开始就没有读懂题目,只是观察输入样例发现两个的时间差的和除以2得到的结果和输出是一样的。然后我又想到总的飞行时间不超过24个小时,那么后缀怎么会有(+2)呢?打算把所有有+2后缀的直接算是24个小时,那我一顿莽肯定是做不到了。做了蓝桥杯的题还是那个感觉,一定要思考清楚再动手。

但是在学习的过程中也学到了,关于正则表达式和java的格式化输入的一些知识。

比如我一直以为java的geInt是while (输入属于0-9)的形式,打算先get一个Int然后再getChar,虽说java没有输入一个字符的函数,但是在运行的时候getNextInt就报了inputDontMatch的异常,说明getNextInt把后面的“:”也输入进去了。了解之后我得知,输入都是以某个正则表达式作为分离规则,先在缓存区去掉匹配的头部然后取值,直到再次匹配到分离规则。

然后默认是用空白符,也就是空格" “,制表符”\t",换行符"\n"来作为分离规则的。然后我们可以用**scanner.useDelimiter()**来更改这个分离规则。

下面就是我自己写的通过修改分离规则的方式来一点点读输入的代码,有一点小问题就是在每一行读取完第二个秒数要读取后缀的时候,我原来用的是
String end=scanner.next();,结果在遇到没有后缀的输入行时直接把下一行的小时给读到了,因为这些输入函数都是掐头去尾的,在没有后缀的那一行最后只有一个回车,scanner.next();直接把这个回车给去掉了。

换成nextLine就没有这样的问题,所以我也就发现了nextLine是不掐头的,在遇到一个回车是返回一个空字符串,还是很方便的。

还有就是scanner.useDelimiter()是一次更改多次生效的,我还以为是像以前学到的什么设计模式一样更改设置不影响已经生成的对象,实验后发现是可以影响的,应该就是一个set方法,这个函数的返回值是Scaner类型还是很有迷惑性的

import java.util.Scanner;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int legth=Integer.valueOf(scanner.nextLine());
        for (int i = 0; i < legth; i++) {
            int[] res=new int[2];
            for (int j = 0; j < 2; j++) {
                int h=scanner.useDelimiter(":").nextInt();
                int m=scanner.useDelimiter(":").nextInt();
                int s=scanner.useDelimiter(Pattern.compile("\\s|:")).nextInt();
                int h2=scanner.useDelimiter(Pattern.compile("\\s|:")).nextInt();
                int m2=scanner.useDelimiter(":").nextInt();
                int s2=scanner.useDelimiter(Pattern.compile("\\s|:|\\n")).nextInt();
                String end=scanner.nextLine();
                int day=0;
                if (!end.isEmpty())day=end.charAt(3)-'0';
                res[j]=(h2+day*24)*3600+m2*60+s2-h*3600-m*60-s;
            }
            res[0]=(res[0]+res[1])/2;
            System.out.printf("%02d:%02d:%02d\n",res[0]/3600,(res[0]%3600)/60,res[0]%60);
        }
    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值