本文主要是介绍2021-8-22 412. Fizz Buzz(哈希表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
注:
题目:
写一个程序,输出从 1 到 n 数字的字符串表示。
- 如果 n 是3的倍数,输出“Fizz”;
- 如果 n 是5的倍数,输出“Buzz”;
- 如果 n 同时是3和5的倍数,输出 “FizzBuzz”。
示例:
n = 15,
返回:
[
“1”,
“2”,
“Fizz”,
“4”,
“Buzz”,
“Fizz”,
“7”,
“8”,
“Fizz”,
“Buzz”,
“11”,
“Fizz”,
“13”,
“14”,
“FizzBuzz”
]
题解:
思路
每个映射一个判断显然是不可行的,这样写出来的代码一定是丑陋不堪且难以维护的。
如果老板有这样一个需求,明天你把映射关系换掉或者删除一个映射关系吧。对于这种要求,我们只能一个个去修改判断条件的代码。
但我们实际上有个更优雅的做法,那就是把映射关系放在散列表里面。
算法
把所有的映射关系放在散列表 fizzBuzzHash 中,这个散列表形如 { 3: ‘Fizz’, 5: ‘Buzz’ }。
遍历 1 … N。
对于每个数字,遍历 fizzBuzzHash 中的键,检查是否能被它整除。
如果这个数能被键整除,就把当前键映射的值加到到答案字符串后面去。对于散列表的每个键值对,都这样操作。
最后将答案字符串加入答案列表。
通过这样的方式你可以对散列表添加/删除映射关系,同时还不需要修改太多代码。
而对于 FizzBuzzJazz 这个问题,散列表就可以是这样的,{ 3: ‘Fizz’, 5: ‘Buzz’ }。
复杂度分析
时间复杂度: O(N),这里 N 是输入字符串的长度;
空间复杂度: O(1),保存结果集的空间不计算在内。
class Solution {
public:vector<string> fizzBuzz(int n) {vector<string> result;map<int,string> dict={{3,"Fizz"},{5,"Buzz"}};for(int i=1;i<=n;i++){string str;for(auto p:dict){if(i%(p.first)==0){str+=p.second;}}if(str==""){str=to_string(i);}result.push_back(str);}return result;}
};
这篇关于2021-8-22 412. Fizz Buzz(哈希表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!