您的位置:首页 > 其它

FizzBuzzWhizz

2014-05-14 21:37 260 查看
最近部门内的童鞋们一起做了一道题目,不同的人思想境界不一样,从代码就可以看出来。

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

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

题目如下:

你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏。此时有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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: