LeetCode No.412 Fizz Buzz

298 阅读1分钟

原题链接

写一个程序,输出从 1 到 n 数字的字符串表示。

  1. 如果 n 是3的倍数,输出“Fizz”;
  2. 如果 n 是5的倍数,输出“Buzz”;
  3. 如果 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;
    }
  1. 所有的映射关系放在散列表 fizzBuzzHash 中,这个散列表形如 { 3: 'Fizz', 5: 'Buzz' }。 遍历 1 ... N1...N。
  2. 对于每个数字,遍历 fizzBuzzHash 中的键,检查是否能被它整除。
  3. 如果这个数能被键整除,就把当前键映射的值加到到答案字符串后面去。对于散列表的每个键值对,都这样操作。
  4. 最后将答案字符串加入答案列表。
  • 通过这样的方式你可以对散列表添加/删除映射关系,同时还不需要修改太多代码。
  • 时间复杂度 O(N)
  • 空间复杂度 O(1)