關於兩個容積不同的瓶子中裝水可以得到哪些精確值的問題的算法


  上午看到一篇博客(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]
*/

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM