FizzBuzz 是一个在国外比较知名的小游戏,它的游戏规则是:随机选择一个起始数字,从某个玩家开始,如果它能被 3 整除那么就说 “Fizz”,如果能被 5 整除就说 “Buzz”,如果能被 15 整除,那么就说 “Fizz Buzz”,否则直接报出那个数字。第二个人在起始数字上加一,运行如上规则,以此类推。若是哪个玩家说错了,则为输。

由于其简单易懂的游戏规则,这个游戏常常被用在程序员的面试题中。据说仅此一道简单的题目,可以筛选掉 99.5% 的不合格面试者。

给出 1 到 100 的数字,将其按照如下规则输出:若是能被 3 整除,输出 “Fizz”;若是能被 5 整除,输出 “Buzz”;若是能被 15 整除,输出 “Fizz Buzz”。否则直接输出这个数字。

今天我们运用多种语言,给出解决方案。

Python

def fizz_buzz(start, end):
  for i in range(start, end + 1):
	if i % 15 == 0:
		print("Fizz Buzz")
	elif i % 3 == 0:
		print("Fizz")
	elif i % 5 == 0:
		print("Buzz")
	else:
		print(i)

fizz_buzz(1, 100)

Java

private static void FizzBuzz(int start, int end)
{
	for(int i = start; i< end + 1; i++)
	{
		if(i % 15 == 0)
		{
			System.out.println("Fizz Buzz");
		}
		else if(i % 3 == 0)
		{
			System.out.println("Fizz");
		}
		else if(i % 5 == 0)
		{
			System.out.println("Buzz");
		}
		else
		{
			System.out.println(i);
		}
	}
}

CSharp

private static void FizzBuzz(int start, int end)
{
	for (int i = start; i < end + 1; i++)
	{
		if (i % 15 == 0)
		{
			Console.WriteLine("Fizz Buzz");
		}
		else if (i % 3 == 0)
		{
			Console.WriteLine("Fizz");
		}
		else if (i % 5 == 0)
		{
			Console.WriteLine("Buzz");
		}
		else
		{
			Console.WriteLine(i);
		}
	}
}

总结

仔细审题会发现,给出的是 1-100 的 100 个数字,它并不是从传统的 index 0 开始,而且我们需要包含最后的 100 这个数字。

我们必须先判断能否被 15 整除,这也是很多代码出错的一个原因。

Python 实现中我们运用了 range 这个内置函数。在 Python 2 中我们应该使用 xrange,这样对于大量的数据集时可以达到性能上的优势(xrange 是一个 generator,它并不会在调用的时候就把所有数据准备好,比如这里的 100 个数字,而是每次返回一个数字。而 range 则是一次性把 100 个数字在内存中准备完毕。),但是 Python 3 的 range 已经是相当于之前的 xrange,所以可以统一成 range 函数,实际上 Python 3 移除了 xrange 这个函数。

Java 和 C# 的实现基本可以看成没有本质差别。

Fizz Buzz in Python