⭐算法入门⭐《线性迭代》简单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、原题链接

LeetCode 412. Fizz Buzz

二、解题报告

1、思路分析

  • 首先,判断是不是 15 的倍数,然后再来判断是否是 3 的倍数,还是 5 的倍数。
  • 然后,就是 「数字转字符串」 的操作了。
  • 每次通过模 10 取得数字的最后一位,然后再把数字除 10,反复迭代计算,知道数字为 0。并且把取得的每一位组织起来就变成了一个字符串。
  • 按照上图所示,取得的数字位的顺序是 4 → 3 → 2 → 1 4 \\to 3 \\to 2 \\to 1 4321,而实际上我们需要的字符串顺序是 1 → 2 → 3 → 4 1 \\to 2 \\to 3 \\to 4 1234,正好是相反的。基于这个特点,我们需要借助一种数据结构,它就是 —— 栈。
  • 当问题特征满足 「先进后出」 时,可以利用 「栈」 这种数据结构来辅助解决问题。

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. 删除有序数组中的重复项

⭐算法入门⭐《线性枚举》中等03 —— LeetCode 27. 移除元素

算法#03--具体解释最小二乘法原理和代码

线性方程组的迭代解法

线性方程组之迭代法篇

算法入门 01线性枚举(简单 - 第三题)LeetCode 876