Fizz Buzz挺有趣的题目,我现在是按照这个题目简单的实现了编码测试.
1. 题目:
Thisis a lot more complicated than the fizzbuzz problem, and takes some realthinking to get right.
Theaim of the test is to discover the shortest sequence of consecutive numbers,which when they are run through the fizzbuzz algorithm produce the requiredoutput.
Forexample, the shortest sequence that producesfizz
is 3
Whenlooking for the shortest sequence for
fizz buzz
onesequence that produces that output is
3, 4, 5
However,this isn't the shortest. The shortest sequence is 9, 10
Inour case, we are only interested in the numbers between 1 and 100, so be sureyou limit your calculations to that range, otherwise you are likely to exceedtimeout limits.
2. Code:
InverseFizzBuzz.java
3. package devtest; 4. 5. import java.util.Iterator; 6. import java.util.Map; 7. import java.util.Set; 8. import java.util.TreeMap; 9. import java.util.logging.Logger; 10. 11. public class InverseFizzBuzz { 12. 13. 14. private Logger logger = Logger.getLogger(InverseFizzBuzz.class.getName()); 15. 16. private Integer[] finalRange = null; 17. 18. private final int FizzDivisor = 3; 19. private final int BuzzDivisor = 5; 20. 21. private String pattern = ""; 22. 23. /** 24. * FIZZ i % 3 == 0 25. */ 26. private static final String FIZZ = "fizz"; 27. /** 28. * BUZZ i % 5 == 0; 29. */ 30. private static final String BUZZ = "buzz"; 31. 32. 33. private static final String FizzBuzz="fizzbuzz"; 34. 35. 36. private static final String BuzzFizz="buzzfizz"; 37. 38. 39. private static final String FizzBuzzFizz="fizzbuzzfizz"; 40. 41. 42. private static final String FizzFizz="fizzfizz"; 43. 44. 45. private static final String FizzFizzBuzz="fizzfizzbuzz"; 46. 47. /** 48. * 49. */ 50. public InverseFizzBuzz(String[] list) { 51. logger.info("Fizz Divisor = " + FizzDivisor); 52. logger.info("Buzz Divisor = " + BuzzDivisor); 53. for(String s : list){ 54. this.pattern = this.pattern + s; 55. } 56. } 57. private void calculateFIZZ(){ 58. for(int i = 1 ; i <= 100 ; i++){ 59. if (i % FizzDivisor == 0 && i % BuzzDivisor != 0) { 60. this.finalRange = new Integer[] { i }; 61. break; 62. } 63. } 64. } 65. 66. private void calculateBUZZ(){ 67. for(int i = 1 ; i <= 100 ; i++){ 68. if (i % FizzDivisor != 0 && i % BuzzDivisor == 0) { 69. this.finalRange = new Integer[] { i }; 70. break; 71. } 72. } 73. } 74. 75. private void calculateFizzBuzz(){ 76. for(int i = 1 ; i <= 100 ; i++){ 77. if (i % FizzDivisor == 0 && (i+1) % BuzzDivisor == 0) { 78. this.finalRange = new Integer[] { i ,i+1}; 79. break; 80. } 81. } 82. } 83. private void calculateBuzzFizz(){ 84. for(int i = 1 ; i <= 100 ; i++){ 85. if (i % BuzzDivisor == 0 && (i+1) % FizzDivisor == 0) { 86. this.finalRange = new Integer[] { i ,i+1}; 87. break; 88. } 89. } 90. } 91. private void calculateFizzBuzzFizz(){ 92. Map<Integer,String> hashMap = new TreeMap<Integer,String>(); 93. int num1 = 1, num2 = 1, num3 = 1; 94. for (int i = 1; i <= 100; i++) { 95. if (i % FizzDivisor == 0 && i % BuzzDivisor != 0) { 96. hashMap.put(i, FIZZ); 97. } else if (i % FizzDivisor != 0 &&i % BuzzDivisor == 0) { 98. hashMap.put(i,BUZZ); 99. } 100. } 101. Set<Integer> keySet = hashMap.keySet(); 102. boolean bool = false; 103. for (Iterator<Integer> it = keySet.iterator(); !bool && it.hasNext();) { 104. int key = it.next(); 105. String keyValue = hashMap.get(key); 106. if(keyValue.equals(FIZZ)){ 107. if(num1 == 1){ 108. num1 = key; 109. }else{ 110. num3 = key; 111. } 112. }else if(keyValue.equals(BUZZ)){ 113. num2 = key; 114. } 115. 116. if(num1 != 1 && num2 != 1 && num3 !=1 && num1 < num2 && num2 < num3){ 117. this.finalRange = new Integer[num3-num1 + 1]; 118. for(int j=0,i = num1; i <= num3 ; i ++,j ++){ 119. this.finalRange[j] = i; 120. } 121. bool = true; 122. } 123. } 124. } 125. 126. private void calculateFizzFizz(){ 127. Map<Integer,String> hashMap = new TreeMap<Integer,String>(); 128. int num1 = 1, num2 = 1; 129. for (int i = 1; i <= 100; i++) { 130. if (i % FizzDivisor == 0 && i % BuzzDivisor != 0) { 131. hashMap.put(i, FIZZ); 132. } 133. } 134. Set<Integer> keySet = hashMap.keySet(); 135. int buff = 0; 136. boolean bool = false; 137. for (Iterator<Integer> it = keySet.iterator(); !bool && it.hasNext();) { 138. buff = it.next(); 139. if(num1 == 1 && num2 == 1){ 140. num1 = buff; 141. num2 = buff; 142. }else{ 143. num2 = buff; 144. } 145. boolean flag = false; 146. if(num1 != 1 && num2 != 1 && num1 < num2){ 147. for(int i = num1; i <= num2 ; i ++){ 148. if( i % BuzzDivisor != 0){ 149. continue; 150. }else{ 151. num1 = num2 ; 152. flag = true; 153. break; 154. } 155. } 156. if(!flag){ 157. setData(num2,num1); 158. bool = true; 159. } 160. } 161. } 162. } 163. 164. 165. /** <Description functions in a word> 166. * <Detail description> 167. * @author Peter.Qiu [Parameters description] 168. * @return void [Return type description] 169. * @exception throws [Exception] [Exception description] 170. * @see [Related classes#Related methods#Related properties] 171. */ 172. private void calculateSequenceRange(){ 173. if(this.pattern.equals(FIZZ)){ 174. calculateFIZZ(); 175. }else if(this.pattern.equals(BUZZ)){ 176. calculateBUZZ(); 177. }else if(this.pattern.equals(FizzBuzz)){ 178. calculateFizzBuzz(); 179. }else if(this.pattern.equals(BuzzFizz)){ 180. calculateBuzzFizz(); 181. }else if(this.pattern.equals(FizzBuzzFizz)){ 182. calculateFizzBuzzFizz(); 183. }else if(this.pattern.equals(FizzFizz)){ 184. calculateFizzFizz(); 185. }else if(this.pattern.equals(FizzFizzBuzz)){ 186. calculateFizzFizzBuzz(); 187. } 188. } 189. private void calculateFizzFizzBuzz(){ 190. calculateFizzFizz();//shortest of FizzFizz 191. int maxRange = this.finalRange[finalRange.length - 1];// 192. int minRange = this.finalRange[0];// 193. for(int i = maxRange ; i <= 100 ; i ++){ 194. if(i % BuzzDivisor == 0){ 195. maxRange = i; 196. break; 197. } 198. } 199. setData(maxRange,minRange); 200. } 201. 202. private void setData(int max, int min){ 203. this.finalRange = new Integer[max- min + 1]; 204. for(int j =0, i = min ; i <= max ; i++,j++ ){ 205. this.finalRange[j] = i; 206. } 207. } 208. private void displayInfo() { 209. logger.info("=======Dispaly Info Start==============="); 210. logger.info(this.pattern); 211. String result = ""; 212. for(int i = 0 ; finalRange !=null && i < finalRange.length ; i ++){ 213. Integer num = finalRange[i]; 214. if(i < finalRange.length - 1){ 215. result += num+","; 216. }else{ 217. result += num; 218. } 219. } 220. logger.info(result); 221. logger.info("=======Dispaly Info End=============="); 222. } 223. 224. public Integer[] sequence() { 225. calculateSequenceRange(); 226. displayInfo(); 227. return finalRange; 228. } 229. 230.} |
git clone http://git.devtest.net/525f3dd13886977b57372de12c9c0818e633b3e74eb694027a7ee40333f4d230.git devtest
完整的编码及测试:http://download.csdn.net/detail/qiu_11/7791551
写的很简陋,有兴趣的同学可以继续研究。