zoukankan      html  css  js  c++  java
  • 【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;
        }
    };
    
  • 相关阅读:
    修改linux命令行提示符颜色
    passwd命令
    用户与用户组
    计划任务
    sed简单用法
    sed命令实现对文件内容的添加
    C#颜色选择器的调用操作
    插入排序算法的学习
    二叉树的学习记录
    判断两个单链表是否相交及相交的第一个节点
  • 原文地址:https://www.cnblogs.com/flix/p/13289750.html
Copyright © 2011-2022 走看看