参与了一下ThoughtWorks面试题:FizzBuzz

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


转载于:https://my.oschina.net/abbish/blog/233189

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值