前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >412 Fizz Buzz

412 Fizz Buzz

作者头像
木瓜煲鸡脚
发布2021-04-15 15:37:34
4410
发布2021-04-15 15:37:34
举报
文章被收录于专栏:Jasper小笔记Jasper小笔记

01

题目信息

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

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

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

示例:

代码语言:javascript
复制
n = 15,

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

02

题解一

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

代码语言:javascript
复制
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 示例

代码语言:javascript
复制
/*
 * 假设有三个条件了 
 * 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分支就太大量了。其实很简单我们平时写代码即使我们不太注重这个随意的去写,也不会像上面这样写。举个例子: 示例

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

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

代码语言:javascript
复制
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();
}

所以这题也是一样

代码语言:javascript
复制
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 ,并且将条件参数集中管理避免了散落在代码各处便于维护

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

所以代码如下:

代码语言:javascript
复制
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的顺序,然后按需进行选取。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT那个小笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档