Python求解啤酒問題(攜程2016筆試題)
阿新 • • 發佈:2017-05-04
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筆試題)