FizzBuzzWhizz

最近部门内的童鞋们一起做了一道题目,不同的人思想境界不一样,从代码就可以看出来。

写这篇文章不是为了讨论具体的技术问题,是希望大家都做一做,然后对比别人的结果,最后再思考思考为什么有这样的差别。

这道题是一个公司的面试题目,网上也有很多这道题的帖子,大家有兴趣可以去看看。


题目如下:

你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏。此时有100名学生在上课。游戏的规则是:

 

 

1. 你首先说出三个不同的特殊数,要求必须是个位数,比如3、5、7。

2. 让所有学生拍成一队,然后按顺序报数。

3. 学生报数时,如果所报数字是第一个特殊数(3)的倍数,那么不能说该数字,而要说Fizz;如果所报数字是第二个特殊数(5)的倍数,那么要说Buzz;如果所报数字是第三个特殊数(7)的倍数,那么要说Whizz。

4. 学生报数时,如果所报数字同时是两个特殊数的倍数情况下,也要特殊处理,比如第一个特殊数和第二个特殊数的倍数,那么不能说该数字,而是要说FizzBuzz, 以此类推。如果同时是三个特殊数的倍数,那么要说FizzBuzzWhizz。

5. 学生报数时,如果所报数字包含了第一个特殊数,那么也不能说该数字,而是要说相应的单词,比如本例中第一个特殊数是3,那么要报13的同学应该说Fizz。如果数字中包含了第一个特殊数,那么忽略规则3和规则4,比如要报35的同学只报Fizz,不报BuzzWhizz。

 

现在,我们需要你完成一个程序来模拟这个游戏,它首先接受3个特殊数,然后输出100名学生应该报数的数或单词。比如,

 

输入

3,5,7

输出(片段)

 

1

2

Fizz

4

Buzz

Fizz

Whizz

8

Fizz

Buzz

11

Fizz

Fizz

Whizz

FizzBuzz

16

17

Fizz

19

Buzz

一直到100


分析:

看完题目,其实没觉得很难,很简单嘛。

我当初的想法,程序分以下2步:

1. 获取输入,判断输入的正确性,用正则表达式判断。

2. 报数,第5点优先级高于3、4。第4点是第3点的延续。


结果:

做完后上传代码,然后看了其他童鞋的代码。呵呵,大家代码结构和思路还是有很大区别的。看来,我还是太弱了。

A同学表现出了框架设计的能力,代码结构分层很清晰。

B同学表现出了产品意识,各种场景和使用的情况都考虑进去了。

C同学表现出算法的能力,高效!

D同学表现出了按时完成题目的能力。



感想:

这道题目给了我很大的启示,一个人的能力从一个很小的问题都能体现出来。

这样形式的考题挺不错的,以后校招题目尝试这样的题目。


代码:

仅供参考,欢迎吐槽。

public class CountMain {

	private static final int MAX_NUMBER = 100;
	private static final String FIZZ = "Fizz";
	private static final String BUZZ = "Buzz";
	private static final String WHIZZ = "Whizz";
	private static final int ZERO_INDEX = 0;
	private static final int FIRST_INDEX = 1;
	private static final int SECOND_INDEX = 2;
	private static final String EXIT_COMMAND = "qq";

	public static void main(String[] args) {
		System.out.println("请输入3个不重复的个位正整数,格式如下3;5;7;(输入qq退出)");
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			String inputString = scanner.next();
			if (EXIT_COMMAND.equals(inputString)) {
				System.out.println("同学们再见!");
				scanner.close();
				System.exit(0);
			}
			else {
				boolean flag = checkInput(inputString);
				if (flag) {
					int[] mumberArray = getNumberArray(inputString);
					numberOff(mumberArray);
					System.out.println("老师,报数结束!请再输入:");
				} else {
					System.out.println("老师,输入错误,请再次输入!");
				}
			}
		}
	}

	private static boolean checkInput(String pString) {
		String regex1 = "([1-9])";
		String regex2 = "(;)";
		String regex3 = "([1-9])";
		String regex4 = "(;)";
		String regex5 = "([1-9])";
		String regex6 = "(;)";

		Pattern pattern = Pattern.compile(regex1 + regex2 + regex3 + regex4 + regex5 + regex6, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
		Matcher matcher = pattern.matcher(pString);
		return matcher.find();
	}

	private static int[] getNumberArray(String pString) {
		int[] numberArray = new int[] { 0, 0, 0 };
		String[] inputString = pString.split(";");
		int length = inputString.length;
		for (int i = 0; i < length; i++) {
			if (inputString[i] != null) {
				numberArray[i] = Integer.parseInt(inputString[i]);
			}
		}
		return numberArray;
	}

	private static void numberOff(int[] pArray) {
		for (int i = 0; i <= MAX_NUMBER; i++) {
			String count = String.valueOf(i);
			String firstNumber = String.valueOf(pArray[ZERO_INDEX]);
			// contain
			if (count.contains(firstNumber)) {
				System.out.println(FIZZ);
				continue;
			}
			// devide
			if (doDevide(i, pArray)) {
				System.out.println("");
			} else {
				System.out.println(count);
			}
		}
	}

	private static boolean doDevide(int pCount, int[] pArray) {
		boolean devideFlag = false;
		if (pCount % pArray[ZERO_INDEX] == 0) {
			devideFlag = true;
			System.out.print(FIZZ);
		}
		if (pCount % pArray[FIRST_INDEX] == 0) {
			devideFlag = true;
			System.out.print(BUZZ);
		}
		if (pCount % pArray[SECOND_INDEX] == 0) {
			devideFlag = true;
			System.out.print(WHIZZ);
		}
		return devideFlag;
	}

}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值