HUAWEI 机试题:统计射击比赛成绩

🌈 Scala 实现

题目描述:

  • 给定一个射击比赛成绩单,包含多个选手若干次射击的成绩分数,请对每个选手按其最高三个分数之和进行降序排名,输出降序排名后的选手id序列。

题目解析:

  • 给一个数字表示射击的次数,然后给几个选手进行(乱序)射击,生成对应的成绩!

条件如下:

  • 一个选手可以有多个射击成绩的分数,且次序不固定
  • 如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手
  • 如果选手的成绩之和相等,则相等的选手按照其id降序排列

输入描述:

  • 输入第一行,一个整数N,表示该场比赛总共进行了N次射击,产生N个成绩分数(2<=N<=100)
  • 输入第二行,一个长度为N整数序列,表示参与每次射击的选手id(0<=id<=99)
  • 输入第三行,一个长度为N整数序列,表示参与每次射击选手对应的成绩(0<=成绩<=100)

输出描述:

  • 符合题设条件的降序排名后的选手ID序列

示例

输入:

  • 31
  • 3,3,7,4,4,4,4,7,7,3,5,5,5
  • 53,80,68,24,39,76,66,16,100,55,53,80,55

输出:

  • 5,3,7,4

说明:

  • 该场射击比赛进行了13次,参赛的选手为{3,4,5,7}
  • 3号选手成绩53,80,55 最高三个成绩的和为188
  • 4号选手成绩24,39,76,66 最高三个成绩的和为205
  • 5号选手成绩53,80,55 最高三个成绩的和为188
  • 7号选手成绩68,16,100 最高三个成绩的和为184
  • 比较各个选手最高3个成绩的和,有4号>3号=5号>7号,由于3号和5号成绩相等,且id 5>3,所以输出 7,5,3,4

代码:

def main(args: Array[String]): Unit = {

    val scan = new Scanner(System.in)
    // 总设计次数
    var count = scan.nextLine().toInt
    // 射击者ID
    var ids = scan.nextLine().split(",").map(_.toInt)
    // 射击者分数
    var scores = scan.nextLine().split(",").map(_.toInt)

    // 用于存放射击者、对应成绩
    val container = new mutable.HashMap[Int, ListBuffer[Int]]()

    // 将同一个人的成绩放入容器中
    for (index <- 1 to count) {
        // 先将射击者放进去
        container.getOrElseUpdate(ids(index - 1), ListBuffer())
        // 再将射击者的成绩依次追加进去
        container.apply(ids(index - 1)).+=(scores(index - 1))
    }

    // 用于存放输出结果
    val builder = new StringBuilder

    container
    .filter(_._2.size > 2) // 如果成绩个数少于三3个就不要
    .mapValues(_.sum) // 对射击者的成绩求和
    .toList // 转型为 List
    .sortWith((o1, o2) => {
        if (!o1._2.equals(o2._1)) {
            o1._2.compareTo(o2._2) < 0 // 先按照分数升序排列
        } else {
            o1._1.compareTo(o2._1) < 0 // 相同分数的再按照id降序排列
        }
    })
    .foreach(num => {
        builder.append(num._1).append(",") // 将射击者追加到 builder 中
    })

    print(builder.substring(0, builder.size - 1)) // 输出结果

}

 


❤️ END ❤️
  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOEL-T99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值