⭐算法入门⭐《线性迭代》简单03 —— LeetCode 412. Fizz Buzz
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⭐算法入门⭐《线性迭代》简单03 —— LeetCode 412. Fizz Buzz相关的知识,希望对你有一定的参考价值。
🙉饭不食,水不饮,题必须刷🙉
还不会C语言,和我一起打卡! 🌞《光天化日学C语言》🌞
LeetCode 太难?上简单题! 🧡《C语言入门100例》🧡
LeetCode 太简单?大神盘他! 🌌《夜深人静写算法》🌌
一、题目
1、题目描述
写一个程序,输出从 1 到 n n n 数字的字符串表示。
1、如果 n n n 是 3 的倍数,输出 “Fizz”;
2、如果 n n n 是 5 的倍数,输出“Buzz”;
3、如果 n n n 同时是 3 和 5 的倍数,输出 “FizzBuzz”。
样例输入: 15 15 15
样例输出: [
“1”,
“2”,
“Fizz”,
“4”,
“Buzz”,
“Fizz”,
“7”,
“8”,
“Fizz”,
“Buzz”,
“11”,
“Fizz”,
“13”,
“14”,
“FizzBuzz”
]
2、基础框架
- c++ 版本给出的基础框架代码如下:
class Solution {
public:
vector<string> fizzBuzz(int n) {
}
};
3、原题链接
二、解题报告
1、思路分析
- 首先,判断是不是 15 的倍数,然后再来判断是否是 3 的倍数,还是 5 的倍数。
- 然后,就是 「数字转字符串」 的操作了。
- 每次通过模 10 取得数字的最后一位,然后再把数字除 10,反复迭代计算,知道数字为 0。并且把取得的每一位组织起来就变成了一个字符串。
- 按照上图所示,取得的数字位的顺序是 4 → 3 → 2 → 1 4 \\to 3 \\to 2 \\to 1 4→3→2→1,而实际上我们需要的字符串顺序是 1 → 2 → 3 → 4 1 \\to 2 \\to 3 \\to 4 1→2→3→4,正好是相反的。基于这个特点,我们需要借助一种数据结构,它就是 —— 栈。
- 当问题特征满足 「先进后出」 时,可以利用 「栈」 这种数据结构来辅助解决问题。
2、时间复杂度
- 时间复杂度为 O ( n ) O(n) O(n)。
3、代码详解
class Solution {
string getString(int n) {
stack<int> stk;
string s;
while(n) {
stk.push( n % 10 + '0' ); // (1)
n /= 10; // (2)
}
while(!stk.empty()) {
s.push_back( stk.top() ); // (3)
stk.pop();
}
return s;
}
public:
vector<string> fizzBuzz(int n) {
vector<string> ans;
for(int i = 1; i <= n; ++i) {
if(i % 3 == 0 && i % 5 == 0) {
ans.push_back("FizzBuzz");
}else if(i % 3 == 0) {
ans.push_back("Fizz");
}else if(i % 5 == 0) {
ans.push_back("Buzz");
}else {
ans.push_back( getString(i) );
}
}
return ans;
}
};
-
(
1
)
(1)
(1) 每次模10取当前数字
n
n
n 的最后一位,并且通过加上
'0'
将整数转换成字符; - ( 2 ) (2) (2) 除上 10,继续迭代计算下一位;
- ( 3 ) (3) (3) 将栈中的元素按栈顺序弹出来,组成字符串;
- 其它部分代码比较容易理解,就不作过多解释了。
三、本题小知识
当问题特征满足 「先进后出」 时,可以利用 「栈」 这种数据结构来辅助解决问题。
以上是关于⭐算法入门⭐《线性迭代》简单03 —— LeetCode 412. Fizz Buzz的主要内容,如果未能解决你的问题,请参考以下文章
⭐算法入门⭐《线性枚举》简单03 —— LeetCode 26. 删除有序数组中的重复项