程式解決十蘋果問題 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;
}
}