【LeetCode笔记】412. Fizz Buzz

题目

写一个程序,输出从 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"
]

思路

本菜鸡第一反应当然是for循环。但由于希望尽可能的避免使用循环,我写了个还不如用循环效果好的程序。。代码如下:

class Solution(object):

    def fizzBuzz(self, n):
        """
        :type n: int
        :rtype: List[str]
        """  
        def fb(n):
            if n%15==0:
                return 'FizzBuzz'
            if n%3==0:
                return 'Fizz'
            elif n%5==0:
                return 'Buzz'
            else:
                return str(n)
        return list(map(lambda x:fb(x),range(1,n+1)))

蓝后运行效果是这个样子的QAQ
【LeetCode笔记】412. Fizz Buzz_第1张图片
于是我又尝试了一下循环。

class Solution(object):

    def fizzBuzz(self, n):
        """
        :type n: int
        :rtype: List[str]
        """  
        return_list=[]
        for i in range(1,n+1):
            if i%15==0:
                return_list.append('FizzBuzz')
            elif i%3==0:
                return_list.append('Fizz')
            elif i%5==0:
                return_list.append('Buzz')
            else:
                return_list.append(str(i))
        return return_list

不戳不戳,比刚才好一些/手动狗头
【LeetCode笔记】412. Fizz Buzz_第2张图片
然后看了官方解法。

方法一就是上面的循环。

方法二和方法三思路类似,也逃不开循环,但逻辑不一样:这两个思路从字符串连接的角度出发。当数字是3的倍数时,在字符串上连接’Fizz’;当数字是5的倍数时,在字符串上连接’Buzz’。如此一来,当数字同时是3和5的倍数时,字符串会先连接’Fizz’,再连接’Buzz’。

这个方法的优势是,当判断数字为 x x x的倍数的条件增加到3个时,方法一的if语句会增加到7个,而方法二、三只需要再增加一个条件即可。方法三比方法二更优化一些,这里只放方法三的代码了。

class Solution:
    def fizzBuzz(self, n):
        """
        :type n: int
        :rtype: List[str]
        """
        # ans list
        ans = []

        # Dictionary to store all fizzbuzz mappings
        fizz_buzz_dict = {3 : "Fizz", 5 : "Buzz"}

        for num in range(1,n+1):

            num_ans_str = ""

            for key in fizz_buzz_dict.keys():

                # If the num is divisible by key,
                # then add the corresponding string mapping to current num_ans_str
                if num % key == 0:
                    num_ans_str += fizz_buzz_dict[key]

            if not num_ans_str:
                num_ans_str = str(num)

            # Append the current answer str to the ans list
            ans.append(num_ans_str)  

        return ans

作者:LeetCode
链接:https://leetcode-cn.com/problems/fizz-buzz/solution/fizz-buzz-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论里有人说,因为字典是无序的,容易出现顺序的问题。应该使用ordereddict。

你可能感兴趣的:(LeetCode,笔记)