目录
第一站 LeetCode 新手村
前言
最近玩OJ赛,发现对算法的理解还需要更加扎实,code能力还可以进一步提升,所以做这样一个算法的系列文章,用于记录学习心得,交流经验,更好地进步和成长。
题目描述
给你一个整数 n ,找出从 1 到 n 各个整数的 Fizz Buzz 表示,并用字符串数组 answer(下标从 1 开始)返回结果,其中:
answer[i] == "FizzBuzz" 如果 i 同时是 3 和 5 的倍数。
answer[i] == "Fizz" 如果 i 是 3 的倍数。
answer[i] == "Buzz" 如果 i 是 5 的倍数。
answer[i] == i (以字符串形式)如果上述条件全不满足。
示例1
输入:n = 3 输出:["1","2","Fizz"]
示例 2
输入:n = 5 输出:["1","2","Fizz","4","Buzz"]
示例 3
输入:n = 15
输出:["1","2","Fizz","4","Buzz","Fizz","7","8","Fizz","Buzz","11","Fizz","13","14","FizzBuzz"]
提示
1 <= n <= 104
解题思路
预知
LeetCode是核心代码模式,所以只需要考虑核心算法,输入由系统自动完成,最后的输出以return返回;
思路
从1~n,遍历提取3的倍数,5的倍数即可,对于不是二者的倍数,返回对应的数字即可,巧妙的思路详解请参考代码注释,注释以“FizzBuzz”的输出为例;
重点
在C++11中emplace_back比push_back更加高效,因为调用 构造函数 原地构造,不需要触发拷贝构造和移动构造;
代码
C++
class Solution {
public:
vector<string> fizzBuzz(int n) {
vector<string> answer;
for(int i=1;i<=n;i++){
string ans; //临时字符串ans每次清空 用以存储该次循环的字符串
if(i%3==0){
ans += "Fizz"; //因为"FizzBuzz"字符串中,Fizz在前,所以先计算是否是3的倍数
}
if(i%5==0){ //字符串拼接的过程中会直接相加中间无其他字符,若同时是5的倍数
ans += "Buzz"; //ans = "FizzBuzz"
}
if(ans.size()==0){ //ans不为空,不进入
ans += to_string(i);
}
answer.emplace_back(ans); //emplace_back比push_back更加高效
} //因为调用 构造函数 原地构造,不需要触发拷贝构造和移动构造
return answer;
}
};
Python3
class Solution:
def fizzBuzz(self, n: int) -> List[str]:
result = []
for i in range(1, n+1):
ans=''
if i%3==0:
ans += "Fizz"
if i%5 == 0:
ans+= "Buzz"
if len(ans)==0:
ans += str(i)
result.append(ans)
return result
总结
以上就是今天要讲的内容,本文仅仅简单讲解了《Fizz Buzz》这一题目,对C++ 中emplace_back和push_back进行了对比,学会了更加高效的向vector容器添加元素的方法。
题目来源
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/fizz-buzz