欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-28 08:37:14
把面试的逻辑题的倒水问题计算了一下最优解的问题: 测试例子: 测试结果: 如果不需要求两种方式中最优解的话,可以不用这么麻烦: public class dsUtil { /** * 算法及原理 * */ public void rsa(int a,int b,int c) { /** * 逻辑题: ......

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

    /**
     * 算法及原理
     * */
    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