412 Fizz Buzz

01

题目信息

题目地址:https://leetcode-cn.com/problems/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"
]

02

题解一

这个题解的话直接按照意思来就可以了

public List<String> fizzBuzz(int n) {
    List<String> res = new ArrayList();
    for(int i = 1; i <= n; i++){
        if(i%3==0 && i%5==0){
            res.add("FizzBuzz");
        }else if(i%3==0){
            res.add("Fizz");
        }else if(i%5==0){
            res.add("Buzz");
        }else{
            res.add(String.valueOf(i));
        }
    }
    return res;
}

03

题解二

这题解题确实是简单,但题可能是希望考虑到代码的黏性减少代码重复降低耦合,所以官方解题也举了例子(假设题目条件不仅仅两个)。 这边也写一下吧,就是说有几种情况就我们就自己手动组合后列举,代码量就会大全都是if 示例

/*
 * 假设有三个条件了 
 * i = 3 Three
 * i = 5 Five
 * i = 7 Seven
 * 那么会组合出8种分支
 */
if(i%3==0 && i%5==0 && i%7==0){
    res.add("ThreeFiveSeven");
}else if(i%3==0 && i%5==0){
    res.add("ThreeFive");
}else if(i%3==0 && i%7==0){
    res.add("ThreeSeven");
}else if(i%5==0 && i%7==0){
    res.add("FiveSeven");
}else if(i%3==0){
    res.add("Three");
}else if(i%5==0){
    res.add("Five");
}else if(i%7==0){
    res.add(Seven);
}else {
    res.add(String.valueOf(i));
}

如果更多一点,那这个if分支就太大量了。其实很简单我们平时写代码即使我们不太注重这个随意的去写,也不会像上面这样写。举个例子: 示例

/*
 * str开头若是'a' 执行a方法
 * str结尾若是'b' 执行b方法
 * 和题目一样两个都满足当然是都要执行的
 */
if(str.charAt(0) == 'a'){
    a();   
}
if(str.charAt(length-1) == 'b'){
    b();
}

一般会像上面这样两个单if,而不是如下:

if(str.charAt(0) == 'a' && str.charAt(length-1) == 'b'){
    a();
    b();
}else if(str.charAt(0) == 'a'){
    a();
}else if(str.charAt(length-1) == 'b'){
    b();
}

所以这题也是一样

public List<String> fizzBuzz(int n) {
    List<String> res = new ArrayList();
    for(int i = 1; i <= n; i++){
        String str = "";
        if (i%3 == 0) {
            str += "Fizz";
        }
        if (i%5 == 0) {
            str += "Buzz";
        }
        if (str.equals("")) {
            str += String.valueOf(i);
        }
        res.add(str);
    }
    return res;
}

04

题解三

像题解二我们使用单if之后,不去手动组合。分支数量会下降,并且结构更清晰(避免嵌套或者多分支),虽然倍率下降但还是会随着条件的增多而增多if。所以若是有很多条件的情况下不妨去存在容器里把很多if变成循环+if ,并且将条件参数集中管理避免了散落在代码各处便于维护

Map<Integer,String> map = new HashMap();
map.put(3,"Fizz");
map.put(5,"Buzz");
for (Integer key : map.keySet()) {
    if (num % key == 0) {
        str += map.get(key);
    }
}

所以代码如下:

public List<String> fizzBuzz(int n) {
    Map<Integer,String> map = new HashMap();
    map.put(3,"Fizz");
    map.put(5,"Buzz");
    List<String> res = new ArrayList();
    for(int i = 1; i <= n; i++){
        String str = "";
        for (Integer key : map.keySet()) {
            if (i % key == 0) {
              str += map.get(key);
            }
        }
        if (str.equals("")) {
            str += String.valueOf(i);
        }
        res.add(str);
    }
    return res;
}

05

总结

这题本身是简单的,但主要是怎么去处理变得通用,就像在过去我们学习javaEE去改写通用servlet一样,把n个方法名的判断通过泛型给免去了,这里也是一样n个if不可能都写出来换成循环遍历n个if,其实还有改进的点,就比如像在题解二举得例子如果说这两个条件都满足所以两个方法都执行,但是它们需要有先后顺序么?如果实际的逻辑是需要的那么解法二可以手动调整单if顺序,但解法三不行因为hashmap的keySet()方法取是乱序的,但可以使用TreeMap或LinkMap.TreeMap是按key升序,而LinkMap是按put的顺序,然后按需进行选取。

本文分享自微信公众号 - IT那个小笔记(Jasper-zh_blog),作者:木瓜煲鸡脚

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-03-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LeetCode 412. Fizz Buzz

    Michael阿明
  • LeetCode 412. Fizz Buzz

    freesan44
  • LeetCode 412. Fizz Buzz

    Write a program that outputs the string representation of numbers from 1 to n.

    用户7447819
  • Leetcode-Easy 412. Fizz Buzz

    728. Self Dividing Numbers 描述: 给定一个整数n,判断1-n之间的数字,输出字符串。如果一个数是3的倍数,输出“FIzz”;如果...

    致Great
  • LeetCode - Fizz Buzz

    原题地址:https://leetcode-cn.com/problems/fizz-buzz/

    晓痴
  • 前缀树问题-LeetCode 409、412、414、415、419、421

    给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。 在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。 注意:...

    算法工程师之路
  • LeetCode 1195 - Fizz Buzz Multithreaded

    Write a program that outputs the string representation of numbers from 1 to n, h...

    Reck Zhang
  • 【译】kotlin 协程官方文档(9)-选择表达式(实验阶段)(Select Expression (experimental))

    我们现在有两个字符串生产者:fizz 和 buzz 。其中 fizz 每 300 毫秒生成一个字符串“Fizz”:

    业志陈
  • LeetCode Fizz Buzz题目分析代码

    Write a program that outputs the string representation of numbers from 1 to n.

    desperate633
  • 开发 | MxNet李沐:机器学习简介——动手学深度学习0.1

    AI科技评论注:本文作者为深度学习平台MxNet的作者李沐,文章由AI科技评论整理自作者的机器学习网站“动手学深度学习”。在这个网站中,李沐介绍了他做这个项目的...

    AI科技评论
  • let { [key]: id = 0, ...rest } = obj-让解构发挥到极限

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

    六小登登
  • 字符串旋转、fizzbuzz、落单的数、翻转整数

    这道题比较简单,可以简单粗暴的直接截断重新拼接即可,但是题目要求使用O(1)的额外空间。

    呼延十
  • TDD案例-FizzBuzz

    FizzBuzz是一个非常适合各种场景使用的编程题目,也被各路大佬推荐用于TDD的教学。具体的FizzBuzz题目描述可参见 http://codingdojo...

    Antony
  • TDD案例-FizzBuzz-重构

    在之前的的TDD案例-FizzBuzz文章中,我们介绍了如何以TDD的方式,通过5个测试用例,来驱动我们实现了FizzBuzz。 本文将继续对FizzBuzz的...

    Antony
  • 在家隔离,不忘学习-FizzBuzz-TDD

    在之前的的TDD案例-FizzBuzz文章中,我们介绍了如何以TDD的方式,通过5个测试用例,来驱动我们实现了FizzBuzz。 本文将继续对FizzBuzz的...

    Antony
  • LintCode-9.Fizz Buzz 问题

    悠扬前奏
  • 测试驱动开发 Test-Driven Development

    本篇文章阅读时间:10min 读者预期的收获是: 认识测试驱动开发 非常简单开启你的TDD之旅 可以编写自动化测试 重构、重新设计旧的代码更加自信 引子 (...

    QQ音乐前端团队
  • 用Python进行单元测试

    Python编程语言,不仅仅在机器学习、数据分析等领域大放异彩,在web开发中等软件开发中,使用者也越来越多。

    老齐
  • LeetCode算法题(一)

    请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。

    万能青年

扫码关注云+社区

领取腾讯云代金券