關於找空心球的算法和代碼

看到網上有這樣的面試題:

 

試題:有53個球和一個天平,有一個是空的,問最少要多少次才能找到空心球。最多要多少次,用程序寫出來。

 

算法:三分法,爲了保證最佳,採用近三等分方法。每次分三組。如果1、2組相等,肯定在第3組中,否則1、2組中輕的一組中。依次類推,直到找到的一組中剩下一個球時爲止。

 

效果:

Create 53 spheres in random... Hollow sphere is [○07]
[●01][●02][●03][●04][●05][●06][○07][●08][●09][●10][●11][●12][●13][●14][●15][●16][●17][●18][●19][●20][●21][●22][●23][●24][●25][●26][●27][●28][●29][●30][●31][●32][●33][●34][●35][●36][●37][●38][●39][●40][●41][●42][●43][●44][●45][●46][●47][●48][●49][●50][●51][●52][●53]
Find round: 1     in 53 spheres.
    into 3 groups:
        group 1: [●01][●02][●03][●04][●05][●06][○07][●08][●09][●10][●11][●12][●13][●14][●15][●16][●17]
        group 2: [●18][●19][●20][●21][●22][●23][●24][●25][●26][●27][●28][●29][●30][●31][●32][●33][●34]
        group 3: [●35][●36][●37][●38][●39][●40][●41][●42][●43][●44][●45][●46][●47][●48][●49][●50][●51][●52][●53]
Find round: 2     in 17 spheres.
    into 3 groups:
        group 1: [●01][●02][●03][●04][●05]
        group 2: [●06][○07][●08][●09][●10]
        group 3: [●11][●12][●13][●14][●15][●16][●17]
Find round: 3     in 5 spheres.
    into 3 groups:
        group 1: [●06]
        group 2: [○07]
        group 3: [●08][●09][●10]
Find round: 4     in 1 spheres.
    The smallest sphere is:[○07]

 

JAVA代碼:

 

import java.util.Random;

public class FindSmallestSphere {
    private static int findRound = 0;
   
    public static Sphere[] initSphere(int max){
        System.out.print("Create "+max+" spheres in random...");
        Sphere[] s = new Sphere[max];
        int idLength = String.valueOf(max).length();
        for(int i=0; i<max; i++){
            s[i] = new Sphere(formatId(i+1,idLength), Sphere.SOLID_SPHERE_WEIGHT);
        }
        Random r = new Random();
        int hollowIndex =r.nextInt(max);
        s[hollowIndex].setWeight(Sphere.HOLLOW_SPHERE_WEIGHT);
        System.out.println(" Hollow sphere is " + s[hollowIndex]);
        return s;
    }
   
    public static String show(Sphere[] spheres, String separator){
        StringBuilder sb = new StringBuilder();
        for(int i=0; i< spheres.length; i++){
            if(i>0)sb.append(separator);
            sb.append(spheres[i]);           
        }
        return sb.toString();
    }
   
    public static int getSpheresWeight(Sphere[] spheres){
        int weight = 0;
        for(int i=0; i< spheres.length; i++){
            weight += spheres[i].getWeight();       
        }
        return weight;
    }
    public static Sphere[] subSpheres(Sphere[] spheres, int start, int end){
        int max = end-start;
        Sphere[] s = new Sphere[max];
        for(int i=0; i<max; i++){
            s[i] = spheres[start+i];
        }
        return s;
    }
   
    public static void find(Sphere[] spheres){
        findRound++;
       
        int total = spheres.length ;
        System.out.println("Find round: " + findRound +"/t in " + total + " spheres.");
        if( total == 1){
            System.out.println("/tThe smallest sphere is:" + spheres[0]);
        }else if( total <=3 ){
            Sphere s = null;
            if(spheres[0].getWeight()<spheres[1].getWeight()){
                s = spheres[0];
            }else if(spheres[0].getWeight()>spheres[1].getWeight()){
                s = spheres[1];
            }else{
                s = spheres[2];
            }
            System.out.println("/tThe smallest sphere is:" + s);
        }else{
            System.out.println("/tinto 3 groups: ");
            int gn = total/3;
            Sphere[] g1 = subSpheres(spheres,0,gn);
            Sphere[] g2 = subSpheres(spheres,gn,gn+gn);
            Sphere[] g3 = subSpheres(spheres,gn+gn,total);
           
            System.out.println("/t/tgroup 1: " + show(g1,""));
            System.out.println("/t/tgroup 2: " + show(g2,""));
            System.out.println("/t/tgroup 3: " + show(g3,""));
           
            if( getSpheresWeight(g1) < getSpheresWeight(g2)){
                find(g1);
            }else if(getSpheresWeight(g1) == getSpheresWeight(g2)){
                find(g3);
            }else{
                find(g2);
            }
        }
    }
   
    public static void main(String[] args) {       
        Sphere[] spheres = initSphere(53);
        System.out.println(show(spheres,""));
        find(spheres);

    }

    private static String formatId(int id, int length){
        StringBuilder sb = new StringBuilder();
        String idstr = String.valueOf(id);
        int idlength = idstr.length();
        for(int i=0; i<length-idlength;i++){
            sb.append('0');
        }
        sb.append(idstr);
        return sb.toString();
    }
}

class Sphere{
    public static final int SOLID_SPHERE_WEIGHT = 80;
    public static final int HOLLOW_SPHERE_WEIGHT = 20;
   
    String id;
    int weight;
   
    public Sphere(String id, int weight){
        this.id = id;
        this.weight = weight;
    }
   
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }
   
    public String getShow(){
        if(this.getWeight()>=SOLID_SPHERE_WEIGHT){
            return "●";
        }else{
            return "○";
        }
    }
   
    public String toString2(){
        StringBuilder sb = new StringBuilder();
        sb.append("[id=").append(this.getId()).append(',').append("weight=").append(this.getWeight()).append("]");
        return sb.toString();
    }
    public String toString(){
        StringBuilder sb = new StringBuilder();
        sb.append("[").append(this.getShow()).append(this.getId()).append(']');
        return sb.toString();
    }
   
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章