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同学表现出了按时完成题目的能力。
感想:
这道题目给了我很大的启示,一个人的能力从一个很小的问题都能体现出来。
这样形式的考题挺不错的,以后校招题目尝试这样的题目。
代码:
仅供参考,欢迎吐槽。
写这篇文章不是为了讨论具体的技术问题,是希望大家都做一做,然后对比别人的结果,最后再思考思考为什么有这样的差别。
这道题是一个公司的面试题目,网上也有很多这道题的帖子,大家有兴趣可以去看看。
题目如下:
你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏。此时有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; } }
相关文章推荐
- 插播题解一则: FizzBuzzWhizz
- ThoughtWorks FizzBuzzWhizz
- 从易于扩展扩展的角度来设计FizzBuzzWhizz
- FizzBuzzWhizz是算法题吗?我从设计的角度去解决的。
- 关于 fizz-buzz-whizz
- FizzBuzzWhizz问题python解法
- FizzBuzzWhizz的JAVA实现
- 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏
- FizzBuzzWhizz游戏的js解法
- FizzBuzzWhizz
- FizzBuzzWhizz
- 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏(C#解法)
- 打个酱油,欢迎指正FizzBuzzWhizz(c#)
- ThoughtWorks代码挑战——FizzBuzzWhizz
- ThoughtWorks面试题-FizzBuzzWhizz
- 最艰难的采访IT公司ThoughtWorks代码挑战——FizzBuzzWhizz游戏
- 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏
- java实现拉钩网上的FizzBuzzWhizz问题示例
- 使用python实现拉钩网上的FizzBuzzWhizz问题示例
- 关于今天很热的--FizzBuzzWhizz