最近部门内的童鞋们一起做了一道题目,不同的人思想境界不一样,从代码就可以看出来。
写这篇文章不是为了讨论具体的技术问题,是希望大家都做一做,然后对比别人的结果,最后再思考思考为什么有这样的差别。
这道题是一个公司的面试题目,网上也有很多这道题的帖子,大家有兴趣可以去看看。
题目如下:
你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏。此时有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;
}
}