看到题目最开始设计思路时候就是奔着面向对象实现去的,可以支持多个特殊数,完事后搜了搜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());
})
})