一道有趣的Java编程题


// 定义一个Answer类来表示一个答案

data class Answer(val number: Int, val name: String)



// 定义一个Student类来表示一个同学

data class Student(val first: Answer, val second: Answer)



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<Student>, rightAnswerList: MutableList<Answer>, 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)

    }

}





运行结果如下:


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


### 最后

**如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!**

![](https://img-blog.csdnimg.cn/img_convert/8aa82daed02a47c8a9f2792bc6d3b381.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/9c3e3952df9a99a767b0af13c36accab.webp?x-oss-process=image/format,png)

:



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

最后

如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!

[外链图片转存中…(img-NR1ZgaLs-1718872490064)]

[外链图片转存中…(img-ZLq4uuud-1718872490065)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值