看到题目最开始设计思路时候就是奔着面向对象实现去的,可以支持多个特殊数,完事后搜了搜10行的实现方法,说实话,刚工作时候公司几个哥们一起搞的一个解题游戏时候用过那种思路,但实际产品中基本上没用过,比较偏门取巧,不易于代码在团队及后来人中流传百世,至于效率问题,我通常是搭好底子,不见兔子不撒鹰。
代码随手用Javascript写的,执行环境是NodeJS
入口文件:index.js
执行: ./index.js --sq 100 --sn 3,5,7 --sns Fizz,Buzz,Whizz
#!/usr/bin/env node /** * Created by abbish on 5/3/14. * */ var program = require('commander'); var parseList = function(value) { return value.split(','); }; var parseInt = function(value) { return value - 0; } program .version('0.0.1') .option('--sq <sq>', 'Student qty', parseInt, 100) .option('--sn <sn>', 'Special number comma separated (e.g 3,5,7)', parseList , [3, 5, 7]) .option('--sns <sns>', 'Special number string comma separated (e.g Fizz,Buzz,Whizz)',parseList , ['Fizz', 'Buzz', 'Whizz']) .parse(process.argv); var lib = require('./lib'); lib.init(program.sn, program.sns); for (var i = 1; i <= program.sq; i++) { var n = new lib.studentNumber(i); console.log(n.echo()); }
用到的lib文件:./lib/index.js
var specialNumberObjects = []; //特殊数对象集合 //初始化基数对象 var init = function(spn, spnString) { for(var i = 0; i < spn.length; i++) { specialNumberObjects.push(new specialNumber(spn[i], spnString[i])); } }; //特殊数对象 var specialNumber = function(number, string) { this.number = number; this.string = string; this.isM = function(number) { return (number % this.number == 0); }; this.isI = function(number) { return (number + '').indexOf(this.number + '') > 0 } }; //报数对象 var studentNumber = function(number) { this.number = number; this.echoString = ''; this.echo = function() { for(var i = 0; i < specialNumberObjects.length; i++) { //是否包含第一个特殊数 if(i == 0 && specialNumberObjects[i].isI(this.number)) { this.echoString = specialNumberObjects[i].string; break; } //检查倍数 if(specialNumberObjects[i].isM(this.number)) { this.echoString += specialNumberObjects[i].string; } } return this.echoString.length <= 0 ? this.number : this.echoString; }; }; exports.specialNumber = specialNumber; exports.studentNumber = studentNumber; exports.init = init;
测试用例:test/357.test.js
/** * Created by abbish on 5/3/14. */ var assert = require("assert"); var lib = require('../lib'); var specialNumber = [3, 5, 7]; var specialNumberString = ['Fizz', 'Buzz', 'Whizz']; lib.init(specialNumber, specialNumberString); describe('Test', function() { it('should return 1 when the number is 1', function(){ var number = new lib.studentNumber(1); assert.equal('1', number.echo()); }); it('should return Fizz when the number is 3', function(){ var number = new lib.studentNumber(3); assert.equal('Fizz', number.echo()); }); it('should return Buzz when the number is 5', function(){ var number = new lib.studentNumber(5); assert.equal('Buzz', number.echo()); }); it('should return Whizz when the number is 7', function(){ var number = new lib.studentNumber(7); assert.equal('Whizz', number.echo()); }); it('should return Fizz when the number is 9', function(){ var number = new lib.studentNumber(9); assert.equal('Fizz', number.echo()); }); it('should return Fizz when the number is 13', function(){ var number = new lib.studentNumber(13); assert.equal('Fizz', number.echo()); }); it('should return FizzBuzz when the number is 15', function(){ var number = new lib.studentNumber(15); assert.equal('FizzBuzz', number.echo()); }); it('should return FizzBuzz when the number is 15', function(){ var number = new lib.studentNumber(15); assert.equal('FizzBuzz', number.echo()); }); it('should return 17 when the number is 17', function(){ var number = new lib.studentNumber(17); assert.equal('17', number.echo()); }); it('should return Buzz when the number is 20', function(){ var number = new lib.studentNumber(20); assert.equal('Buzz', number.echo()); }); it('should return Whizz when the number is 56', function(){ var number = new lib.studentNumber(56); assert.equal('Whizz', number.echo()); }) it('should return Whizz when the number is 63', function(){ var number = new lib.studentNumber(63); assert.equal('Fizz', number.echo()); }) })