換汽水(華為程式設計題)

Allen-Liu發表於2017-09-13

看到華為有一道換汽水的程式設計題,分享如下:

題目:某商店規定:三個空汽水瓶可以換一瓶汽水。小張手上有十個空汽水瓶,她最多可以換多少瓶汽水喝?答案是5瓶,方法如下:先用9個空瓶子換3瓶汽水,喝掉3瓶滿的,喝完以後4個空瓶子,用3個再換一瓶,喝掉這瓶滿的,這時候剩2個空瓶子。然後你讓老闆先借給你一瓶汽水,喝掉這瓶滿的,喝完以後用3個空瓶子換一瓶滿的還給老闆。如果小張手上有n個空汽水瓶,最多可以換多少瓶汽水喝?


題目要求的輸入是這樣的:第一行表示對少個空瓶能夠換一瓶汽水;然後有多行輸入,算出每行輸入的空瓶數最多能夠換購的汽水數。(這裡我們並不侷限於10次以內輸入)

好了我們分析一下怎麼做:

如果b個空瓶能夠換一瓶汽水,那麼當我們擁有的空瓶數小於b-2的時候是換不到汽水的(即使向老闆借一瓶也不夠);

如果我們擁有的空瓶數n=b-1,這時候就可以通過向老闆借一瓶汽水,然後喝完將所有的空瓶還給老闆來償還剛剛接的那瓶汽水,這樣可以喝到一瓶汽水;

如果我們手上的空瓶n>=b呢?我們可以拿儘可能多的空瓶即(n/b)*b個換來n/b瓶汽水,喝完換來的汽水的時候空瓶數為:n%b+n/b;

然後就可以利用遞迴的思想,再拿手上的空瓶去換購。

從上面的分析中可以發現,遞迴的結束條件是:手上的所有空瓶數小於等於b-2。

程式碼實現如下:

import java.util.Scanner;//用於獲得輸入
import java.util.ArrayList;
public class QiShui 
{
	static int base, count;//用於記錄多少個空瓶換一瓶汽水和一共喝到的汽水數
	public static void main(String[] args) 
	{
		ArrayList<Integer> num1 = new ArrayList<Integer>();//用於記錄輸入
		Scanner in = new Scanner(System.in);
		int tmp, number;//用於記錄臨時值和要計算的次數
		while (true)
		{
			tmp = in.nextInt();
			//判斷輸入是否結束
			if (tmp == 0)
			{
				break;
			}
			num1.add(tmp);//這裡有一個int到Integer的轉換
		}
		base = num1.get(0);//獲得多少空瓶換一瓶汽水
		number = num1.size();//獲得要計算的數值個數
		for (int i = 1; i < number; i++)
		{
			count = 0;
			fun(num1.get(i));  
            System.out.println(count); 
		}
	}
	public static void fun(int n){  
        if(n <= base - 2)
        {  
            return;  
        }
        else if(n == base - 1)
        {  
            count++;  
            return;  
        }
        else
        {  
            count = count + n / base;  
            fun(n / base + n % base);//遞迴呼叫  
        }  
    }  
}


相關文章