Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天来看一个小问题:烤蛋糕。
提问
阿峰喜欢烤一些蛋糕,他有一些食谱和成分。不幸的是他数学不好,读者能帮他找出根据他的食谱可以烤多少个蛋糕吗?
编写一个函数 cakes(),它接受食谱 (HashMap<&str, u32>) 和可用成分(也是HashMap<&str, u32>)并返回阿峰可以烘焙的最大蛋糕数量 (u32)。为简单起见,没有数量单位(例如 1 磅面粉或 200 克糖只是 1 或 200)。物体中不存在的成分可视为 0。
例:
input:[("flour", 500), ("sugar", 200), ("eggs", 1)],[("flour", 1200), ("sugar", 1200), ("eggs", 5), ("milk", 200)]
output:2
input:[("apples", 3), ("flour", 300), ("sugar", 150), ("milk", 100), ("oil", 100)],[("sugar", 500),("flour", 2000), ("milk", 2000)]
output:0
模板:
use std::collections::HashMap;
fn cakes(recipe: &HashMap<&str, u32>, available: &HashMap<&str, u32>) -> u32 {
todo!()
}
分析
想象一下我们平时制作一些需要原材料的东西,做出来东西的数量取决于原材料最少得那份数量。例如:制作一个蛋糕需要 100 克面粉,2 个鸡蛋,如果我们手里有 300 克面粉,3 个鸡蛋,那么也只能做一个蛋糕,因为最少的原材料鸡蛋只有 3 个,只能做一个蛋糕。以此总结,我们遍历食谱上,从可用清单上去取这些这原材料,计算能够制作蛋糕的最小值即可。
解决方案
use std::collections::HashMap;
use std::cmp::min;
fn cakes(recipe: &HashMap<&str, u32>, available: &HashMap<&str, u32>) -> u32 {
let mut pieces = u32::MAX;
for (m, v) in recipe {
if let Some(av) = available.get(m) {
pieces = min(av / v, pieces)
} else {
return 0;
}
}
pieces
}
如果可用清单上没有对应的原材料,那么说明不能制作,直接返回 0 。
Trick
- 遍历
HashMap只需要使用for循环,for (k, v) in map。 - 模式匹配,如果有结果:
if let Some(v) = map.get(k)。