程序解决十苹果问题 Java

时间:2024-02-17 17:52:24

程序解决十苹果问题 Java

题目:10个苹果,其中有9个重量相同,剩余1个相比其它重量不同(或重或轻,不得而知),使用天平比较三次,找出重量特殊的那一个

import org.junit.Test;
import java.util.Random;

public class MyUtil {
    class Apple {
        public int weight;
        public Apple(int weight) {
            this.weight = weight;
        }
    }

    @Test
    public void test() {
        int special = tenApples(50, 51);
        System.out.println("**********************");
        System.out.println(special);
    }

    /**
     * 10个苹果,其中有9个重量相同,剩余1个相比其它重量不同(或重或轻,不得而知),使用天平比较三次,返回特殊苹果的下标
     * @param normalWeight 普通苹果的重量
     * @param specialWeight 特殊苹果的重量
     * @return 特殊苹果的下标
     */
    public int tenApples(int normalWeight, int specialWeight) {
        Random random = new Random();
        //产生一个 0 - 9 的随机数,用来确定特殊重量苹果的下标
        int specialIndex = random.nextInt(9);
        System.out.println("---------------------");
        System.out.println(specialIndex);
        //定义10个苹果
        Apple[] apples = new Apple[10];
        //构造10个苹果
        for (int i = 0; i < 10; ++i) {
            if(i == specialIndex) {
                apples[i] = new Apple(specialWeight);
            }else {
                apples[i] = new Apple(normalWeight);
            }
        }
        //将第0个到第2个苹果放在一起(第一堆),第3个到第5个苹果放在一起(第二堆),第6个到第8个苹果放在一起(第三堆)
        int weight0to2 = apples[0].weight + apples[1].weight + apples[2].weight;
        int weight3to5 = apples[3].weight + apples[4].weight + apples[5].weight;
        int weight6to8 = apples[6].weight + apples[7].weight + apples[8].weight;
        //第一次用天平比较,确定第一堆和第二堆是否一样重
        if(weight0to2 == weight3to5) {
            /*
            在确定第一堆和第二堆一样重的情况下,进行第二次比较,确定第一堆和第三堆是否一样重,如果是,说明特殊苹果是第9个;
            如果不是,说明特殊苹果在第三堆中,并且如果第一堆苹果比第三堆重,说明特殊的那个苹果比普通苹果轻,否则说明特殊的那个苹果比普通苹果重
             */
            if(weight0to2 == weight6to8) {
                return 9;
            }
            /*
            在确定特殊苹果在第三堆中的情况下,进行第三次比较,如果第6个和第7个苹果一样重,则可以确定特殊苹果是第8个;如果不是一样重,
            就要看那个特殊的苹果比普通苹果重还是轻,如果重,则第6个和第7个中较重的那个是特殊苹果,反之则较轻的那个是特殊苹果。
             */
            if (apples[6].weight == apples[7].weight) {
                return 8;
            }
            if (weight0to2 > weight6to8) {
                return apples[6].weight > apples[7].weight ? 7 : 6;
            }
            return apples[6].weight > apples[7].weight ? 6 : 7;
        }
        /*
        在确定第一堆和第二堆不一样重的情况下,进行第二次比较,确定第一堆和第三堆是否一样重,如果是,说明特殊苹果在第二堆中,
        并且如果第一堆苹果比第二堆重,说明特殊的那个苹果比普通苹果轻,否则说明特殊的那个苹果比普通苹果重。
        如果第一堆和第三堆不一样重,说明特殊苹果在第一堆中。并且如果第一堆苹果比第三堆重,说明特殊的那个苹果比普通苹果重,
        否则说明特殊的那个苹果比普通苹果轻
         */
        if(weight0to2 == weight6to8) {
            /*
            第一堆和第三堆一样重,确定特殊苹果在第二堆中,进行第三次比较,如果第3个苹果和第4个苹果一样重,则特殊苹果是第5个;
            如果不是一样重,就要看那个特殊的苹果比普通苹果重还是轻,如果重,则第3个和第4个中较重的那个是特殊苹果,
            反之则较轻的那个是特殊苹果。
             */
            if(apples[3].weight == apples[4].weight) {
                return 5;
            }
            if(weight0to2 > weight3to5) {
                return apples[3].weight > apples[4].weight ? 4 : 3;
            }
            return apples[3].weight > apples[4].weight ? 3 : 4;
        }
        /*
        第一堆和第三堆不一样重,确定特殊苹果在第一堆中,进行第三次比较,如果第0个苹果和第1个苹果一样重,则特殊苹果是第2个;
        如果不是一样重,就要看那个特殊的苹果比普通苹果重还是轻,如果重,则第0个和第1个中较重的那个是特殊苹果,
        反之则较轻的那个是特殊苹果。
         */
        if(apples[0].weight == apples[1].weight) {
            return 2;
        }
        if(weight0to2 > weight3to5) {
            return apples[0].weight > apples[1].weight ? 0 : 1;
        }
        return apples[0].weight > apples[1].weight ? 1 : 0;
    }
}