首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java解决Fizz Buzz问题

用Java解决Fizz Buzz问题
EN

Code Review用户
提问于 2020-07-23 04:34:48
回答 4查看 5.4K关注 0票数 6

问题:

编写一个将数字从1打印到100的程序。但对于三种印刷品的倍数,"Fizz“而不是数字,以及五种打印"Buzz”的倍数。对于三倍和五倍的数字,请打印"FizzBuzz“。

来自这里的问题。

这是我的密码:

代码语言:javascript
复制
/*
 * Code by Clint
 */

public class FizzBuzz {
    public static void main(String[] args) {
        for (int numbers = 1; numbers <= 100; numbers++) {
            if (numbers % 3 == 0 && numbers % 5 == 0) {
                System.out.println("Fizz Buzz");
            } else if (numbers % 3 == 0) {
                System.out.println("Fizz");
            } else if (numbers % 5 == 0) {
                System.out.println("Buzz");
            } else {
                System.out.println(numbers);
            }
        }
    }
}

这是输出:

EN

回答 4

Code Review用户

发布于 2020-07-23 05:41:58

除了变量名numbers之外,代码看起来很完美。这个变量只包含一个数字,因此它的名称必须是number

由于变量仅在非常小的范围内使用,所以名称ni也是可以接受的。(视乎个人喜好而定)

票数 13
EN

Code Review用户

发布于 2020-07-23 17:09:48

想象一下FizzBuzz上的一个变体与n不同的说法-这个音节-如果规则。你想查查2^n的案子吗?这将导致大量代码(O(2^n)行)或深嵌套代码(带有O(n)最大缩进)。幸运的是,问题陈述帮了你一个忙:关于15的可分性,它要求您打印FizzBuzz,而不是像您尝试的那样用空格打印FizzBuzz。因此,干净代码方法(包括O(n)行和O(1)最大缩进)更像这样:

代码语言:javascript
复制
public class FizzBuzz {
    public static void main(String[] args) {
        for (int number = 1; number <= 100; number++) {
            String toPrint = "";
            if(number % 3 == 0) {
                toPrint += "Fizz";
            }
            if(number % 5 == 0) {
                toPrint += "Buzz";
            }
            if (toPrint.isEmpty()) {
                toPrint = Integer.toString(number);
            }
            System.out.println(toPrint);
        }
    }
}

即使在这种情况下,在n=2中,这种方法也有一定的优势。你很容易避免--如果--这两个问题都是这样的话,这对读者来说是显而易见的。不需要考虑布尔逻辑。Tom进一步讨论了这里的优点,尽管它适用于JavaScript,而不是JavaScript。

一个单独的问题是指我们是否需要所有这些支撑。

(顺便说一句,我去复数了你的虚拟变量的名字,所以它看起来不像一个数字列表。)

票数 12
EN

Code Review用户

发布于 2020-07-23 16:15:09

就我个人而言,我在代码中看到了多个“任务”。

  • 启动应用程序
  • 从1数到100
  • 决定打印当前数字的内容。
  • 打印出来

对于我来说,“开始”是一个额外的任务,因为如果我希望我的应用程序在不同的环境(在本地机器上计数为100,但在我的超级计算机上为100万)上的行为不同,那么这里将是获取所需信息并将其转发到“功能”的地方。

是的,这是为这个小代码示例设计的,但是我们倾向于使用小代码示例,然后将其应用于大型应用程序。因此,我喜欢以大枪为小例子,只要目标是训练。:-)

在我看来,下面的代码要长得多,但它更容易理解,因为每个方法名称都给出了其中将要发生的“上下文”。这使得跟踪和理解底层代码变得更加容易。

此外,当“任务”在逻辑上分离时,那么对其应用更改就容易多了。更改“规则”只意味着更改convertNumber函数。更改其打印结果的方式只会更改output方法。另外,在额外的类中提取这些功能并注入它们也是非常容易的。然后,在外部(环境)决定输出应该通过System.out.println或图形界面进行,这将是一件轻而易举的事情。

但像往常一样,许多方法使我们达到我们的目标(S)。和往常一样,如果你选择一种方式,那么你会得到好的东西,但你必须付出代价。我的方法提供了灵活性,但它更多的是写作。我认为,在高性能环境中,最低限度的慢速性能只是一个论点,我们必须计算每一个周期。

代码语言:javascript
复制
public class FizzBuzzApp {
    public static void main(String[] args) {
        FizzBuzz game = new FizzBuzz();
        game.playGame();
    }
}

public class FizzBuzz {
  public void playGame(){
    for (int numbers = 1; numbers <= 100; numbers++) {
      String result = convertNumber(number);
      output(result);
    }
  }
  
  private String convertNumber(int number) {
    if (numbers % 3 == 0 && numbers % 5 == 0) {
      return "Fizz Buzz";
    } else if (numbers % 3 == 0) {
      return "Fizz";
    } else if (numbers % 5 == 0) {
      return "Buzz";
    } else {
      return String.valueOf(number);
    }
  }

  private void output(String value) {
    System.out.println(value);
  }
}

很高兴听到你对我的方法的看法

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/245902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档