首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FizzBuzz实现

FizzBuzz实现
EN

Code Review用户
提问于 2012-05-04 21:01:25
回答 3查看 78.1K关注 0票数 16

我看到的常见FizzBuzz实现是使用% 15的检查来打印"FizzBuzz“

如果这样做有什么不对/更好的地方,你能告诉我吗?

代码语言:javascript
运行
复制
public class FizzBuzz {
    public static void main(String[] args) {
        for (int i = 1; i <= 100; i++) {
            boolean fizzOrBuzz = false;
            if (i % 3 == 0) {
                System.out.print("Fizz");
                fizzOrBuzz = true;
            }
            if (i % 5 == 0) {
                System.out.print("Buzz");
                fizzOrBuzz = true;
            }

            if (fizzOrBuzz) {
                System.out.println();
            } else {
                System.out.println(String.valueOf(i));
            }
        }
    }
}
EN

回答 3

Code Review用户

发布于 2012-05-04 21:39:45

让我们将您的版本与% 15版本进行比较:

代码语言:javascript
运行
复制
public class FizzBuzz {
    public static void main(String[] args) {
        for (int i = 1; i <= 100; i++) {
            if (i % 15 == 0) {
                System.out.println("FizzBuzz")
            } else if (i % 3 == 0) {
                System.out.println("Fizz");
            } else if (i % 5 == 0) {
                System.out.println("Buzz");
            } else {
                System.out.println(String.valueOf(i));
            }
        }
    }
}

% 15版本更简单,更容易阅读。这个版本将问题巧妙地划分为4种不同的情况,并处理每一种情况。相反,您的版本引入了一个布尔逻辑标志(我认为它是一个重要的反模式),并且不完全直观地依赖if语句的顺序。

票数 29
EN

Code Review用户

发布于 2012-05-04 21:19:37

看上去很好。String.valueOf()是不必要的,System.out.println(i)会打印相同的内容,但仍然可以。此测试仅用于确保受访者能够按照链接站点的规定编写代码:

这类问题不会识别出优秀的程序员,但它会识别出薄弱的程序员。这绝对是朝着正确方向迈出的一步。

票数 6
EN

Code Review用户

发布于 2012-09-04 15:26:53

它们肯定不是完美的,但我尝试了一些优化测试的方法,这里是结果(我有数字来跟踪良好的响应),我使用StringBuilder来避免初始化输出IO:

代码语言:javascript
运行
复制
package exercices;

import java.util.Hashtable;

import org.memneuroo.outils.communs.utilitaires.EnvPrm;

public class FizzBuzz {
    // time for cum with nbIter=30 > 300; 30 ~= 3000
    static final int nbIter = 30;
    static final String sep = "_";

    static long ifNested() {
        final StringBuilder sb = new StringBuilder();
        final long t = System.nanoTime();
        for (int i = 0; i < nbIter; i++) {
            sb.append(//
            i % 15 == 0 //
                ? "FizzBuzz" //
                : (i % 3 == 0 //
                    ? "Fizz"//
                    : (i % 5 == 0//
                        ? "Buzz" //
                        : i)));// sb.append(sep);
        }
        final long totT = System.nanoTime() - t;
        System.out.format("ifNested\t%20d\n", totT);
        // sb.append(EnvPrm.NEWLINE); System.out.println(sb.toString());
        return totT;
    }

    static long stringPlus() {
        final StringBuilder sb = new StringBuilder();
        final long t = System.nanoTime();
        for (int i = 0; i < nbIter; i++) {
            String x = "";
            x += (i % 3 == 0) ? "Fizz" : "";
            x += (i % 5 == 0) ? "Buzz" : "";
            if (x.isEmpty()) { // MODIF
                x += Integer.toString(i);
            }
            sb.append(x);// sb.append(sep);
        }
        final long totT = System.nanoTime() - t;
        System.out.format("stringPlus\t%20d\n", totT);
        // sb.append(EnvPrm.NEWLINE); System.out.println(sb.toString());
        return totT;
    }

    static long withIf() {
        final StringBuilder sb = new StringBuilder();
        final long t = System.nanoTime();
        for (int i = 0; i < nbIter; i++) {
            if (i % 3 == 0) {
                sb.append("Fizz");
                if (i % 5 == 0) {
                    sb.append("Buzz");
                }
            } else if (i % 5 == 0) {
                sb.append("Buzz");
            } else {
                sb.append(i);
            }// sb.append(sep);
        }
        final long totT = System.nanoTime() - t;
        System.out.format("withIf\t\t%20d\n", totT);
        // sb.append(EnvPrm.NEWLINE);System.out.println(sb.toString());
        return totT;
    }

    static long withArray() {
        final String[] lis = {"FizzBuzz", "", "", "Fizz", "", "Buzz", "Fizz",
            "", "", "Fizz", "Buzz", "", "Fizz", "", "",};
        final StringBuilder sb = new StringBuilder();
        final long t = System.nanoTime();
        for (int i = 0; i < nbIter; i++) {
            final String pos = lis[i % 15];
            sb.append(((0 == pos.length()) ? i : pos));// sb.append(sep);
        }
        final long totT = System.nanoTime() - t;
        System.out.format("withArray\t%20d\n", totT);
        // sb.append(EnvPrm.NEWLINE); System.out.println(sb.toString());
        return totT;
    }

    static long withTable() {
        final Hashtable<Integer, String> ht = new Hashtable<>(8);
        ht.put(0, "FizzBuzz");
        ht.put(3, "Fizz");
        ht.put(5, "Buzz");
        ht.put(6, "Fizz");
        ht.put(9, "Fizz");
        ht.put(10, "Buzz");
        ht.put(12, "Buzz");
        final StringBuilder sb = new StringBuilder();
        final long t = System.nanoTime();
        for (int i = 0; i < nbIter; i++) {
            final String s = ht.get(i % 15);
            // MODIF
            // http://www.developpez.net/forums/d1196563-2/java/general-java/if-null-object-if-objet-null/#post6561766
            // sb.append((null == s ? i : s));// sb.append(sep);
            if (null == s) {
                sb.append(i);
            } else {
                sb.append(s);
            }
        }
        final long totT = System.nanoTime() - t;
        System.out.format("withTable\t%20d\n", totT);
        // sb.append(EnvPrm.NEWLINE); System.out.println(sb.toString());
        return totT;

    }

    static int recursive(final StringBuilder sb, final int n) {
        if (0 == n) {
            return 1;
        }
        if (n % 3 == 0) {
            sb.insert(0, "Fizz");
            if (n % 5 == 0) {
                sb.insert(0, "Buzz");
            }
        } else if (n % 5 == 0) {
            sb.insert(0, "Buzz");
        } else {
            sb.insert(0, n);
        }
        return n + recursive(sb, n - 1);
    }

    static long recursive() {
        final StringBuilder sb = new StringBuilder("");
        final long t = System.nanoTime();
        recursive(sb, nbIter);
        final long totT = System.nanoTime() - t;
        System.out.format("recursive\t%20d\n", totT);
        sb.append(EnvPrm.NEWLINE);
        System.out.println(sb.toString());
        return totT;
    }

    /*** @param args */
    public static void main(final String[] args) {
        long cum = 0L, cum2 = 0L;
        for (int i = 0; i < 5; i++) {
            System.out.println("------ " + i + " -----");
            final long totSb = stringPlus();
            final long totIn = ifNested();
            final long totWi = withIf();
            final long totWa = withArray();
            final long totWt = withTable();
            final long totRe = recursive();
            System.out.format("... stringPlus/withIf :%5d\n", (totSb * 100)
                / totWi);
            System.out.format("...   ifNested/withIf :%5d\n", (totIn * 100)
                / totWi);
            System.out.format("...  withArray/withIf :%5d\n", (totWa * 100)
                / totWi);
            System.out.format("...  withTable/withIf :%5d\n", (totWt * 100)
                / totWi);
            System.out.format("...  recursive/withIf :%5d\n", (totRe * 100)
                / totWi);
            cum += totIn + totSb + totWi + totWa + totWt + totRe;
            System.out.println("CUMUL (SECOND) == " + cum / 100000000 + "."
                + cum % 100000000 + "\t , diff: " + (cum - cum2));
            cum2 = cum;
        }
    }
}

以及产出:

代码语言:javascript
运行
复制
------ 0 -----
stringPlus                529397
ifNested                  643657
withIf                     27657
withArray                  43581
withTable                  40788
recursive                  87441
12Fizz4BuzzFizz78FizzBuzz11Fizz1314BuzzFizz1617Fizz19BuzzFizz2223FizzBuzz26Fizz2829BuzzFizz

... stringPlus/withIf : 1914
...   ifNested/withIf : 2327
...  withArray/withIf :  157
...  withTable/withIf :  147
...  recursive/withIf :  316
CUMUL (SECOND) == 0.1372521  , diff: 1372521
------ 1 -----
stringPlus                345295
ifNested                   88280
withIf                     88279
withArray                  88838
withTable                 101689
recursive                  93308
12Fizz4BuzzFizz78FizzBuzz11Fizz1314BuzzFizz1617Fizz19BuzzFizz2223FizzBuzz26Fizz2829BuzzFizz

... stringPlus/withIf :  391
...   ifNested/withIf :  100
...  withArray/withIf :  100
...  withTable/withIf :  115
...  recursive/withIf :  105
CUMUL (SECOND) == 0.2178210  , diff: 805689
------ 2 -----
stringPlus                380216
ifNested                   36597
withIf                     20953
withArray                  60063
withTable                  91352
recursive                 111467
12Fizz4BuzzFizz78FizzBuzz11Fizz1314BuzzFizz1617Fizz19BuzzFizz2223FizzBuzz26Fizz2829BuzzFizz

... stringPlus/withIf : 1814
...   ifNested/withIf :  174
...  withArray/withIf :  286
...  withTable/withIf :  435
...  recursive/withIf :  531
CUMUL (SECOND) == 0.2878858  , diff: 700648
------ 3 -----
stringPlus                489168
ifNested                   29613
withIf                     22070
withArray                  27099
withTable                  27378
recursive                  91911
12Fizz4BuzzFizz78FizzBuzz11Fizz1314BuzzFizz1617Fizz19BuzzFizz2223FizzBuzz26Fizz2829BuzzFizz

... stringPlus/withIf : 2216
...   ifNested/withIf :  134
...  withArray/withIf :  122
...  withTable/withIf :  124
...  recursive/withIf :  416
CUMUL (SECOND) == 0.3566097  , diff: 687239
------ 4 -----
stringPlus                143035
ifNested                   24025
withIf                     15924
withArray                  23187
withTable                  26819
recursive                  87162
12Fizz4BuzzFizz78FizzBuzz11Fizz1314BuzzFizz1617Fizz19BuzzFizz2223FizzBuzz26Fizz2829BuzzFizz

... stringPlus/withIf :  898
...   ifNested/withIf :  150
...  withArray/withIf :  145
...  withTable/withIf :  168
...  recursive/withIf :  547
CUMUL (SECOND) == 0.3886249  , diff: 320152
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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