Scala 实现
题目描述:
题目解析:
条件如下:
输入描述:
输出描述:
示例
输入:
- 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)) // 输出结果
}