1. 程式人生 > >Python求解啤酒問題(攜程2016筆試題)

Python求解啤酒問題(攜程2016筆試題)

sep 走了 參考資料 很難 bucket static turn and item

問題描述:一位酒商共有5桶葡萄酒和1桶啤酒,6個桶的容量分別為30升、32升、36升、38升、40升和62升,
並且只賣整桶酒,不零賣。第一位顧客買走了2整桶葡萄酒,第二位顧客買走的葡萄酒是第一位顧客的2倍。
那麽,本來有多少升啤酒呢?
解析:由於該酒商只賣整桶酒,簡單分析幾個桶的容量可知,第二位顧客必須買走剩下的3桶葡萄酒才有可能是第一位顧客的2倍。
假設第一位顧客買走的葡萄酒共L升,那麽第二位顧客買走的是2L升。也就是說,葡萄酒的總數應該能被3整除。所以,解法就呼之欲出了。

Python 解法1

1 buckets = {30,32,36,38,40,62}
2 total = sum(buckets)
3 for item in buckets:
4     if (total-item) % 3 == 0:
5         print(item)
6         break

雖然這樣也能簡單的解決問題,但是再考慮多一點,註意題目“只賣整桶”這個限制條件,更加規範的解法如下(但似乎沒什麽必要)

解法2

技術分享
 1 buckets = {30,32,36,38,40,62}
 2 def solve(buckets):
 3     total = sum(buckets)
 4     for item in buckets:
 5         div,mod = divmod((total-item),3)
 6         if mod == 0:            
 7             for i in buckets:
 8                 j = div - i
 9                 if j!=i and (j in buckets):
10                     return (item,(i,j))
11     return ‘no answer‘
12     
13 print(solve(buckets))
技術分享

代碼中第8行 因為第一個顧客買的是2桶酒之和,所以驗證是否存在這2桶酒,假如不存在即返回no answer。

Java 實現(java底子比較淺,寫起來代碼很難看,如果有更好的寫法希望能賜教一下)

技術分享
 1 public static int bear(){
 2         int buckets[] = {30,32,36,38,40,62};
 3         int sum = 0;
 4         for(int bs :buckets){
 5             sum += bs;
 6         }
 7         for(int i=0;i<6;i++){
 8             int rest = sum-buckets[i];
 9             int mod = rest % 3;
10             if(mod == 0) {
11                 int div = rest / 3;
12                 for(int j=0;j<6;j++){
13                     int sep = div - buckets[j];
14                     if(sep != buckets[j] && InBuckets(sep,buckets)){
15                         return buckets[i];
16                     }
17                 }
18             }
19         }
20         return 0;
21     }
22 
23 public static boolean InBuckets(int x,int[] buckets){
24         for(int i=0;i<buckets.length;i++){
25             if(x == buckets[i]){
26                 return true;
27             }
28         }
29         return false;
30     }
技術分享

參考資料 微信號 Python_xiaowu

Python求解啤酒問題(攜程2016筆試題)