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

匿名 (未验证) 提交于 2019-12-02 21:53:32

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

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

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!