Leetcode412. Fizz Buzz

发布于 2024-07-23  201 次阅读


最初提交的代码如下:

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

使用了两个计数器来跟踪Fizz和Buzz的状态,多个if分支也增加了代码的复杂度和每次迭代的执行时间

通过题解,学习到了一种更快的方法

return new java.util.AbstractList<>() {
            @Override
            public int size() {
                return n;
            }

            @Override
            public String get(int index) {
                index++;
                return switch ((0 == index % 3 ? 1 : 0) + (0 == index % 5 ? 2 : 0)) {
                    case 1 -> "Fizz";
                    case 2 -> "Buzz";
                    case 3 -> "FizzBuzz";
                    default -> Integer.toString(index);
                };
            }
        };

将 if 改用 switch-case ,避免了额外的计数器、减少了循环体内的逻辑判断,这是优化时间的关键步骤

继承java.util.AbstractList来实现List<String>接口,仅实现了sizeget方法,可以在需要时按需计算值,而不是预先生成整个结果列表

最初担心 % 会有效率问题所以没有使用,现在发现使用 % 取余运算符的效率足够高,可以使用