最初提交的代码如下:
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>
接口,仅实现了size
和get
方法,可以在需要时按需计算值,而不是预先生成整个结果列表
最初担心 % 会有效率问题所以没有使用,现在发现使用 % 取余运算符的效率足够高,可以使用
Comments NOTHING