25匹赛马,没有秒表,五条跑道。用最少的比赛场次找出三匹跑得最快的马。过程分析

package com.java.practice;

/**
 * Created by liud on 2017/8/26.
 */
public class ThreeFastTest {
    public static void main(String[] args) {
        int count = 0;
        /**
         * 25匹赛马,没有秒表,五条跑道。用最少的比赛场次找出三匹跑得最快的马。
         * 关键在于不能一次让25匹马一次跑来比较,一次最多比较5匹马
         * 用分组排除的方式找到最快的三匹马
         */

        /**
         * 假设现在分5个组
         * 每一组都跑,记录下每组最快的3个,并标记排名
         */
        String[] compare_first_1 = {"A1", "A4", "A5", "A2", "A3"};
        String[] compare_first_2 = {"B4", "B5", "B1", "B2", "B3"};
        String[] compare_first_3 = {"C1", "C4", "C5", "C2", "C3"};
        String[] compare_first_4 = {"D2", "D1", "D3", "D4", "D5"};
        String[] compare_first_5 = {"E1", "E2", "E3", "E4", "E5"};
        //5轮比试后的结果
        String[] horses1_first = {"A1", "A2", "A3"};
        String[] horses2_first = {"B1", "B2", "B3"};
        String[] horses3_first = {"C1", "C2", "C3"};
        String[] horses4_first = {"D1", "D2", "D3"};
        String[] horses5_first = {"E1", "E2", "E3"};
        count = 5;
        /**
         * 还剩下15匹马
         * 将每组排名第一的马屁进行比较,选出前三,并标记排名
         */
        String[] compare_two = {"A1", "B1", "C1", "D1", "E1"};
        count += 1;
        /**
         * 找到最快的前3名马屁
         * 根据结果:
         * 可以排除跑的慢的两只队伍("D1", "E1"所在的队伍)
         */
        //假如A1第一,B1第二,C1第三,就可以排除掉D队所有马屁,以及E1所有马屁
        //则还剩下:

        String[] horses1_num_one = {"A1", "A2", "A3"};
        String[] horses2_num_two = {"B1", "B2", "B3"};
        String[] horses3_num_three = {"C1", "C2", "C3"};
        /**
         * 最快的那匹马假设为 A1,而要找到还剩下两匹快马,我们可以继续排除一些马儿
         * 比如说B3,如果B3是最快的三匹马之一,那么B1、B2比她快,
         * 此时就是 A1、B1、B2、B3则有4匹了,所以可以果断排毒B3
         * 而跑的最慢的C队,我们可以排除C2、C3,依然用反证法,C2是跑的最快的3匹马之一,
         * 那么比它快的则有C1,而B1又比C1快,则至少为A1、B1、C1、C2,也多了,
         * 所以C2排除,自然C3比C2慢,依然排除
         *
         * 此轮比试 得到的结果,A1 为跑的最快的那匹马,剩余没比较的马屁为:
         */
        String[] compare_three = {"A2", "A3", "B1", "B2", "C1"};
        /**
         * 刚好五匹马,一次比较,找到最快的两只,跟A1加起来就是我们要找的最快的那三匹马儿
         */
        count += 1;

        /**
         * count最后结果为7次
         */
    }
}

以上为个人想法,有更好的方式可以留言,谢谢。

你可能感兴趣的:(面试笔试)