【LeetCode-字符串】Fizz Buzz

题目描述

写一个程序,输出从 1 到 n 数字的字符串表示。

  1. 如果 n 是3的倍数,输出“Fizz”;

  2. 如果 n 是5的倍数,输出“Buzz”;

3.如果 n 同时是3和5的倍数,输出 “FizzBuzz”。

示例:

n = 15,

返回:
[
    "1",
    "2",
    "Fizz",
    "4",
    "Buzz",
    "Fizz",
    "7",
    "8",
    "Fizz",
    "Buzz",
    "11",
    "Fizz",
    "13",
    "14",
    "FizzBuzz"
]

题目链接: https://leetcode-cn.com/problems/fizz-buzz/

思路1

常规的解法,使用 3 个条件逐个判断,分别是:是否是 3 和 5 的倍数、是否是 3 的倍数、是否是 5 的倍数。注意,“是否是 3 和 5 的倍数” 要当做第一个条件,其他两个条件顺序无所谓。代码如下:

class Solution {
public:
    vector<string> fizzBuzz(int n) {
        if(n<1) return {};

        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(to_string(i));
        }
        return ans;
    }
};

思路2

思路 1 求解 FizzBuzz 是没问题的,因为条件只有 3 个。假如,现在有一个 FizzBuzzJazz 游戏,也就是 3 的倍数输出 Fizz、5 的倍数输出 Buzz、7 的倍数输出 Jazz、……,总的条件如下:

  • 能不能被 3 整除
  • 能不能被 5 整除
  • 能不能被 7 整除
  • 能不能同时被 3 和 5 整除
  • 能不能同时被 5 和 7 整除
  • 能不能同时被 3 和 7 整除
  • 能不能同时被 3,5,7 整除
  • 不能被 3,5,7 其中任何一个数整除

可以看到,判断十分繁琐。我们可以换一种思路,先判断能不能被 3 整除,能的话在答案后边加上 Fizz,再判断能不能被 5 整除,能的话在答案后边加上 Buzz,最后判断能不能被 7 整除,能的话在答案后边加上 Jazz,如果都不能的话对应的字符串就是当前数字。代码如下:

class Solution {
public:
    vector<string> fizzBuzz(int n) {
        if(n<1) return {};

        vector<string> ans;
        for(int i=1; i<=n; i++){
            string cur = "";
            if(i%3==0) cur += "Fizz";
            if(i%5==0) cur += "Buzz";
            if(cur=="") cur = to_string(i);
            ans.push_back(cur);
        }
        return ans;
    }
};

思路3

一种更好的写法是将数字和对应的字符串放在哈希表中,这样当我们想要更改这种对应关系时,只需要更改哈希表就行了,不需要对代码的逻辑部分进行修改。代码如下:

class Solution {
public:
    vector<string> fizzBuzz(int n) {
        if(n<1) return {};

        map<int, string> hash({{3,"Fizz"}, {5,"Buzz"}});
        vector<string> ans;
        for(int i=1; i<=n; i++){
            string cur = "";
            for(auto it=hash.begin(); it!=hash.end(); it++){
                if(i%it->first==0) cur += it->second;
            }
            if(cur=="") cur = to_string(i);
            ans.push_back(cur);
        }
        return ans;
    }
};
原文地址:https://www.cnblogs.com/flix/p/13289750.html