[炼手Rust]烤蛋糕

58 阅读2分钟

Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天来看一个小问题:烤蛋糕。

Pink-Mini-Cakes-with-Vanilla-and-Berries.jpg

提问

阿峰喜欢烤一些蛋糕,他有一些食谱和成分。不幸的是他数学不好,读者能帮他找出根据他的食谱可以烤多少个蛋糕吗?

编写一个函数 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

  1. 遍历HashMap只需要使用for循环,for (k, v) in map
  2. 模式匹配,如果有结果:if let Some(v) = map.get(k)