一道有趣的Java编程题

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

**开源地址:https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB **

fun main() {

// 定义A、B、C、D、E五个同学

val A = Student(Answer(2, "陕西"), Answer(5, "甘肃"))

val B = Student(Answer(2, "湖北"), Answer(4, "山东"))

val C = Student(Answer(1, "山东"), Answer(5, "吉林"))

val D = Student(Answer(3, "湖北"), Answer(4, "吉林"))

val E = Student(Answer(2, "甘肃"), Answer(3, "陕西"))



// 定义一个集合,保存未知正确答案的所有同学

var unknownAnswerStudentList = mutableListOf(A, B, C, D, E)

// 定义保存正确答案的集合

val rightAnswerList = mutableListOf<Answer>()

// 假设第一个人的第一个答案是正确答案,保存到正确答案集合中

rightAnswerList.add(A.first)

// 因为找到A同学的正确答案了,所以把A同学从集合中移除

unknownAnswerStudentList.remove(A)

// 找到所有正确答案

findAllRightAnswers(unknownAnswerStudentList, rightAnswerList, unknownAnswerStudentList.size)



if (rightAnswerList.size == 5) {

    println("第一次假设就找到了正确答案,如下:")

} else {

    println("第一次假设找不到正确答案,第二次肯定是正确答案,如下:")

    // 没找齐5个答案,说明最初假设的答案是错的,则另一个必定是正确答案,重新找

    unknownAnswerStudentList = mutableListOf(A, B, C, D, E)

    rightAnswerList.clear()

    rightAnswerList.add(A.second) // 假设另一个为正确答案

    unknownAnswerStudentList.remove(A)

    findAllRightAnswers(unknownAnswerStudentList, rightAnswerList, unknownAnswerStudentList.size)

}



// 打印正确答案

rightAnswerList.forEach(System.out::println)

}

fun findAllRightAnswers(unknownAnswerStudentList: MutableList, rightAnswerList: MutableList, findCount: Int) {

// 遍历每一个同学,使用iterator是因为在遍历集合的同时还要删除集合的元素。

val iterator = unknownAnswerStudentList.iterator()



while (iterator.hasNext()) {

    val student = iterator.next()



    // 通过正确答案找正确答案

    if (rightAnswerList.any { student.first.number == it.number || student.first.name == it.name }) {

        // 如果第一个答案的编号或名称与正确答案的相同,根据"每个编号只有一个人答对"说明这个是错误答案,则第二个答案可能是正确答案

        if (rightAnswerList.any { student.second.number == it.number || student.second.name == it.name }) {

            // 如果第二个答案的编号或名称与正确答案相同,说明这个也是错误答案,说明我们的假设是错误的,无解,退出循环

            break

        }



        rightAnswerList.add(student.second) // 找到了正确答案,此学生的第一个答案是错误答案,所以第二个答案是正确答案

        iterator.remove()                   // 此学生已找到正确答案,可以从集合中移除掉了

    } else if (rightAnswerList.any { student.second.number == it.number || student.second.name == it.name }) {

        // 如果第二个答案的编号或名称与正确答案的相同,根据"每个编号只有一个人答对"说明这个是错误答案,则第一个答案可能是正确答案

        if (rightAnswerList.any { student.first.number == it.number || student.first.name == it.name }) {

            // 如果第一个答案的编号或名称与正确答案相同,说明这个也是错误答案,说明我们的假设是错误的,无解,退出循环

            break

        }



        rightAnswerList.add(student.first) // 找到了正确答案,此学生的第二个答案是错误答案,所以第一个答案是正确答案

        iterator.remove()                  // 此学生已找到正确答案,可以从集合中移除掉了

    }

}



if (unknownAnswerStudentList.size > 0 && findCount - 1 > 0) {

    // 如果还有同学没找到正确答案,且没有超过查找次数,则递归循环去找

    // 设定查找次数是因为如果你假设的答案是错误的,则永远也找不齐5个正确答案造成死循环

    findAllRightAnswers(unknownAnswerStudentList, rightAnswerList, findCount - 1)

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值