⭐算法入门⭐《线性枚举》简单08 —— 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) 将栈中的元素按栈顺序弹出来,组成字符串;
  • 其它部分代码比较容易理解,就不作过多解释了。

三、本题小知识

当问题特征满足 「先进后出」 时,可以利用 「栈」 这种数据结构来辅助解决问题。


  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英雄哪里出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值