【一线大厂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)
}
}