写一个程序,输出从 1 到 n 数字的字符串表示。
- 如果 n 是3的倍数,输出“Fizz”;
- 如果 n 是5的倍数,输出“Buzz”;
- 如果 n 同时是3和5的倍数,输出 “FizzBuzz”。
示例:
n = 15,
返回:
[
"1",
"2",
"Fizz",
"4",
"Buzz",
"Fizz",
"7",
"8",
"Fizz",
"Buzz",
"11",
"Fizz",
"13",
"14",
"FizzBuzz"
]
字符串连接
public List<String> fizzBuzz(int n) {
List<String> result = new ArrayList<>(n);
for (int i = 1; i <= n; i++) {
String res = "";
if (i % 3 == 0) {
res += "Fizz";
}
if (i % 5 == 0) {
res += "Buzz";
}
if (res.equals("")) {
res = String.valueOf(i);
}
result.add(res);
}
return result;
}
- 时间复杂度 O(n)
- 空间复杂度 O(1)
散列表
这种方式相比于上面那种,更容易修改新增的条件
public List<String> fizzBuzz2(int n) {
LinkedHashMap<Integer, String> dict = new LinkedHashMap<>(4);
dict.put(3, "Fizz");
dict.put(5, "Buzz");
List<String> result = new ArrayList<>(n);
for (int i = 1; i <= n; i++) {
String res = "";
Set<Map.Entry<Integer, String>> entries = dict.entrySet();
for (Map.Entry<Integer, String> entry : entries) {
if (i % entry.getKey() == 0) {
res += entry.getValue();
}
}
if (res.equals("")) {
res = String.valueOf(i);
}
result.add(res);
}
return result;
}
- 所有的映射关系放在散列表 fizzBuzzHash 中,这个散列表形如 { 3: 'Fizz', 5: 'Buzz' }。 遍历 1 ... N1...N。
- 对于每个数字,遍历 fizzBuzzHash 中的键,检查是否能被它整除。
- 如果这个数能被键整除,就把当前键映射的值加到到答案字符串后面去。对于散列表的每个键值对,都这样操作。
- 最后将答案字符串加入答案列表。
- 通过这样的方式你可以对散列表添加/删除映射关系,同时还不需要修改太多代码。
- 时间复杂度 O(N)
- 空间复杂度 O(1)