• 关于两个容积不同的瓶子中装水可以得到哪些精确值的问题的算法


      上午看到一篇博客(http://www.cnblogs.com/chinhi/archive/2012/09/26/fdsf.html),里面是腾讯2013年校园招聘笔试题,有这样一道题(在其他面试过程也会经常看到类似的):

      用容积分别为15升和27升的两个杯子向一个水桶中装水,可以精确向水桶中注入()升水?

      A、53  B、25  C、33  D、52

      对于这类问题有没有好的算法可以确定所有可以精确得到的值呢?

      注:这里说的所有是指不大于容积大的杯子的容积。

      我们可以这样想,首先我们可以得到的是12升的值,方案是把大杯装满水,然后把小杯倒满,这样可以得到:27 - 15 = 12。

      得到12后怎么办呢,我们把12升水倒入空的15升的杯子中,然后把大杯装满水把小杯倒满,也就是: 27 - (15 - 12) = 24。

      现在得到的精确值是24升,大于小杯容积(15升),我们可以用大杯中的水把小杯倒满,然后把小杯中的水倒掉,再把大杯中剩下的水倒入小杯,后面的过程跟上面的步骤一样:27 - (15 - (24 - 15))= 21,在这一步同时还可以得到 24 - 15 = 9升。

      反复以上的过程,直到结束。

      那么什么时候结束呢,应该是当得到的精确的值没有重复的时候。

      上面的过程用代码实现如下:

    if(!Array.indexOf){
        Array.prototype.indexOf = function(val){
            var arr=this;
            for(var i=arr.length;i>=0;i--){
                if(arr[i] === val){
                    return i;
                }
            }
            return -1;
        }
    }
    
    function getAllNum(iMin,iMax){
        var tempNum=0;
            result = [];
        while(true){
            if(tempNum <= iMin) {
                tempNum = iMax - (iMin - tempNum);
                if(result.indexOf(tempNum) !== -1)
                    break;
                result.push(tempNum);
            }
            else {
                tempNum = tempNum % iMin;
                if(result.indexOf(tempNum) !== -1)
                    break;
                result.push(tempNum);
                
                tempNum = iMax - (iMin - tempNum);
                if(result.indexOf(tempNum) !== -1)
                    break;
                result.push(tempNum);
            }
            console.log(tempNum,iMin,iMax);
        }
        return result.sort(function(a,b){
                return parseInt(a) - parseInt(b);
            });
    }
    
    //Test
    console.log(getAllNum(15,27));
    /*
    12 15 27
    
    24 15 27
    
    21 15 27
    
    18 15 27
    
    15 15 27
    
    27 15 27
    
    [3, 6, 9, 12, 15, 18, 21, 24, 27]
    */

      如果其他朋友有更好的算法,欢迎留言交流。

  • 相关阅读:
    docker---基本操作
    one_day_one_linuxCmd---netstat命令
    docker---Dockerfile编写
    one_day_one_linuxCmd---sz命令
    one_day_one_linuxCmd---scp命令
    同义英语词汇整理
    网络实习——校园网络设计方案
    实现 FTP 客户端和服务器程序所调用的系统函数
    2020年上半年总结
    单片机的串行总线拓展技术
  • 原文地址:https://www.cnblogs.com/jscode/p/2704067.html
Copyright © 2020-2023  润新知