2018科大讯飞Java笔试第二道编程题

题目

大学生足协决定举办全国性的大学生足球赛,由每个学校派遣一支队伍代表该校参赛。比赛分区分为几个赛区进行,最终的总决赛中,将有不超过n支队伍参加。经过激烈的角逐,有机会参与总决赛的队伍已经决出。

协会对比赛的规则进行了调整,以便使得比赛更具有观赏性。

  1. 总决赛的参赛队伍为n支,n为偶数;

  2. 进入前1/2的队伍才有资格进入淘汰赛;

  3. 队伍按积分排名,具体规则为:胜一场积3分;平一场积1分;负一场积0分。队伍首先按积分降序排列,积分相同按净胜球数降序排列,仍然相同的按进球数降序排列。

  4. 基于上述规则,尚未出现有排名歧义的情况发生。

随着赛程的进行,目前各个队伍对战的结果已经确定了,小B负责确定进入淘汰赛的名单,她向你求助,你能帮她吗?

输入

测试数据有多组,每组测试数据的第一行为一个整数n(1=< n <=50),为参与总决赛的球队数,随后的n行为球队的名字,由不超过30个的大小写拉丁字母构成。
随后的n*(n-1)/2行为赛事的开展情况,每行的格式为name1-name2 num1:num2,表示两支队伍的比分情况(1< num1< num2 <100)。
确保不会有两支队伍同名,也不会出现队伍自己通自己比赛的情况,且每场比赛仅出现一次。

输出

对每组测试数据,输出n/2行,为按字母序排列的进入淘汰赛的n/2支队伍的名单,每个名字在单独的行中输出。

样例输入

4

A

B

C

D

A-B 1:1

A-C 2:2

A-D 1:0

B-C 1:0

B-D 0:3

C-D 0:3

2

a

A

a-A 2:1

样例输出

A

D

a

代码

package com.iflytek.test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;

public class BallGame {

    public void process(Map<String, Integer>nameScores,List<String>scoreList){
        //根据符号把结果的字符串切割,并且把球队得分相加
        for(int i=0;i<scoreList.size();i++){
            String[] splits = scoreList.get(i).split(" ");
            String[] names = splits[0]. split("-");
            String[] scores = splits[1].split(":");
            for(int j=0;j<2;j++){
            nameScores.replace(names[j], nameScores.get(names[j])+Integer.parseInt(scores[j]));
            }
        }
        Integer[] scores = new Integer[nameScores.size()];
        System.out.println("每个球队的得分是:");
        Set<String> nameSet = nameScores.keySet();
        int i=0;
        for(String name:nameSet){
            int score = nameScores.get(name);
            scores[i++]= score;
            System.out.println(name+"\t"+score);
        }

        System.out.println("进入总决赛的球队是:");
        //使用Arrays将scores进行降序排序,并且使用lambda创建一个匿名的降序Comparator
        Arrays.sort(scores,(o1,o2)->{
            return o2.compareTo(o1);
        });

//      这是按照高分降序输出球队的方法,不符合题目的按照字母升序输出
//      for(int j=0;j<scores.length/2;j++){
//          for(String name:nameSet){
//              if(nameScores.get(name).equals(scores[j])){
//                  System.out.println(name);
//              }
//          }
//      }

        for(String name:nameSet){
            for(int j=0;j<scores.length/2;j++){
                //依据字母升序依次遍历球赛的名字是否获得进入决赛的分数,
                //可获得按照字母升序输出球队决赛的结果
                if(nameScores.get(name).equals(scores[j])){
                    System.out.println(name);
                    break;
                }
            }
        }
    }


    public static void main(String[] args) {
        Scanner in= new Scanner(System.in);
        System.out.println("请输入球队数量:");
        int number = Integer.parseInt(in.nextLine());
        System.out.println("请输入"+number+"个球队的名字:");
        //TreeSet会根据key的字母进行升序排序,方便后续根据字母升序输出决赛球队
        Map<String, Integer> nameScores = new TreeMap<String, Integer>();
        for(int i=0;i<number;i++){
            String name = in.nextLine();
            nameScores.put(name, 0);
        }
        System.out.println("请输入所有球队比赛的结果:");
        System.out.println("格式为:name1-name2 score1:score2");
        List<String> scoreList = new ArrayList<>();
        for(int i=0;i<(number*(number-1)/2);i++){
            String result = in.nextLine();
            scoreList.add(result);
        }
        in.close();
        BallGame ballGame = new BallGame();
        ballGame.process(nameScores, scoreList);
    }

}

运行结果

请输入球队数量:
4
请输入4个球队的名字: //乱序输入字母,后面也会按照字母升序输出
B
A
D
C
请输入所有球队比赛的结果:
格式为:name1-name2 score1:score2
A-B 1:1
A-C 2:2
A-D 1:0
B-C 1:0
B-D 0:3
C-D 0:3
每个球队的得分是:
A   4
B   2
C   2
D   6
进入总决赛的球队是:
A
D
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值