面试笔记---逻辑题:倒水问题

时间:2024-04-17 13:09:39

  把面试的逻辑题的倒水问题计算了一下最优解的问题:

    /**
     * 算法及原理
     * */
    public int[] rsa(int[] data) {
        /** 
         * 逻辑题:有两个水杯,一个是aL一个是bL,水可以随便用,怎么得到cL
         *         即用满进满出的原则,要么是aL满倒向bL,要么bL满倒向aL循环得出
         *         即 满足:ax-by=c/bx-ay=c
         *         关于每个水杯满了的次数x/y默认设为不大于100
         * */
        int a=data[0];
        int b=data[1];
        int c=data[2];
        
        int sum=0;
        for(int x=0;x<100;x++) {
            for(int y=0;y<100;y++) {
                if(a*x-b*y==c) {
                    sum=x+y;
                    //返回a,b,x,y,sum
                    int [] datas= {a,b,x,y,sum};
                    return datas;
                }
            }
        }
        return data;
    }
    
    /**
     * 调用方法,
     * 因为有两种可能,即调用两次,第二次把a.b顺序交换赋值
     * */
    public void use(int[] data) {
        int a=data[0];
        int b=data[1];
        int c=data[2];
        //交换后调用
        int[] data1= {a,b,c};
        int[] data2= {b,a,c};
        //获取返回的数组
        int[] s1 =rsa(data1);
        int[] s2=rsa(data2);
        
        //判断总步数,寻找最优解
        if(s1[4]<s2[4]) {
            String message=s1[0]+"升倒"+s1[1]+"升:x="+s1[2]+",y="+s1[3];
            System.out.println(message);    
        }else {
            String message=s2[0]+"升倒"+s2[1]+"升:x="+s2[2]+",y="+s2[3];
            System.out.println(message);    
        }
    }
}

  测试例子:

public static void main(String[] args) {
    dsUtils test=new dsUtils();
    //传递两个杯子的容量,以及要取的容量
    int[] data= {11,7,2};
    test.use(data);
}

  测试结果:

  

  如果不需要求两种方式中最优解的话,可以不用这么麻烦: 

public class dsUtil {
    /**
     * 算法及原理
     * */
    public void rsa(int a,int b,int c) {
        /** 
         * 逻辑题:有两个水杯,一个是aL一个是bL,水可以随便用,怎么得到cL
         *         即用满进满出的原则,要么是aL满倒向bL,要么bL满倒向aL循环得出
         *         即 满足:ax-by=c/bx-ay=c
         *         关于每个水杯满了的次数x/y默认设为不大于100
         * */        
        for(int x=0;x<100;x++) {
            for(int y=0;y<100;y++) {
                if(a*x-b*y==c) {
                    String message=a+"升倒"+b+"升:x="+x+",y="+y;
                    System.out.println(message);
                    return;
                }
            }
        }    
    }
    
    /**
     * 调用方法,
     * 因为有两种可能,即调用两次,第二次把a.b顺序交换赋值
     * */
    public void use(int a,int b,int c) {
        rsa(a,b,c);
        rsa(b,a,c);
    }
}
View Code

 测试结果:

  

  参考:https://www.cnblogs.com/j-star/p/7127190.html