GVKun编程网logo

参与了一下ThoughtWorks面试题:FizzBuzz(thoughtworks offer)

18

对于参与了一下ThoughtWorks面试题:FizzBuzz感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍thoughtworksoffer,并为您提供关于C#版拉钩题目答案FizzBuzz

对于参与了一下ThoughtWorks面试题:FizzBuzz感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍thoughtworks offer,并为您提供关于C# 版拉钩题目答案 FizzBuzzWhizz、FizzBuzz Ruby单线程、FizzBuzz 面试问题、FizzBuzzWhizz的有用信息。

本文目录一览:

参与了一下ThoughtWorks面试题:FizzBuzz(thoughtworks offer)

参与了一下ThoughtWorks面试题:FizzBuzz(thoughtworks offer)

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


C# 版拉钩题目答案 FizzBuzzWhizz

C# 版拉钩题目答案 FizzBuzzWhizz

https://www.jinshuju.net/f/EGQL3D

这俩天讨论挺火的一个题目。

也看了高手解答,实现的代码很短(PS:个人觉得,该换行还是得换行)。

自己这天也闲着,写了下 C# 版实现,小弟不才用了 100 多行,不足之处多多指教。

扩展方法:

public static class Extension
    {

        public static bool IsIntegerThanZero(this int value)
        {
            return Regex.IsMatch(Convert.ToString(value), @"^[1-9]{1}[\d]*$");
        }

        public static string PartCatchPhrase(this int valueint key, string catchPhrase)
        {
           string sResult = "";
           if (string.IsNullOrWhiteSpace(catchPhrase))
           {
               throw new ArgumentNullException("catchPhrase");
           }
           if (!key.IsIntegerThanZero())
           {
               throw new ArgumentNullException("key");
           }
           Regex.Replace(Convert.ToString(value), string.Format(@"(?<{1}>{0})", key,"GROUP"+key.ToString()),
                    m =>
                    {
                        if (sResult == "")
                        {
                            sResult = !string.IsNullOrEmpty(m.Groups["GROUP" + key.ToString()].Value) ? catchPhrase : sResult;
                        }
                        return "";
                    });
           return sResult;
        }

        public static string DivisibleCatchPhrase(this int valueint key, string catchPhrase,ref string result)
        {
            if (string.IsNullOrWhiteSpace(catchPhrase))
            {
                throw new ArgumentNullException("catchPhrase");
            }
            if (!key.IsIntegerThanZero())
            {
                throw new ArgumentNullException("key");
            }
            result += (value % key == 0 ? catchPhrase : "");
            return result;
        }
    }

口号定义

public class CatchPhrase
    {
        public CatchPhrase() { }
        public CatchPhrase(int index, string catchWord)
        {
            this.Index = index;
            this.CatchWord = catchWord;
        }
        public int Index { getset; }
        public string CatchWord { getset; }
        public override string ToString()
        {
            return this.CatchWord;
        }
        public static explicit operator CatchPhrase(string value)
        {
            int nIndex = -1;
            string sWord = "";
            if(Regex.IsMatch(value,@"^\d+"))
            {
                string sNumber = Regex.Match(value,@"^\d+").Value;
                int.TryParse(sNumber,out nIndex);
                sWord = value.Substring(sNumber.Length+1);
                return new CatchPhrase(nIndex, sWord);
            }
            return null;
            
        }
    }

再费些代码

public class CatchPhraseCollection : KeyedCollection<int, CatchPhrase>
    {
        protected override int GetKeyForItem(CatchPhrase item)
        {
            return item.Index;
        }
        public void Add(string item)
        {
            CatchPhrase cp = (CatchPhrase)item;
            if (cp != null)
            {
                this.Add(cp);
            }
        }
        
    }

演示代码

 static void Main(string[] args)
        {
            CatchPhraseCollection cpc = new CatchPhraseCollection();
            Console.Write("Please input the first special number and CatchWord(number,CatchWord): ");
            cpc.Add(Console.ReadLine());
            Console.Write("Please input the second special number and CatchWord(number,CatchWord): ");
            cpc.Add(Console.ReadLine());
            Console.Write("Please input the third special number and CatchWord(number,CatchWord): ");
            cpc.Add(Console.ReadLine());


            int nIndex;
            Console.Write("Please input an integer number larger than 0: ");
            while (int.TryParse(Console.ReadLine(), out nIndex))
            {
                if (nIndex.IsIntegerThanZero())
                {
                    string sOutput = "";
                    foreach(CatchPhrase item in cpc)
                    {
                        if(sOutput == "")
                        {
                         sOutput = nIndex.PartCatchPhrase(item.Index,item.CatchWord);
                        }
                        else
                            break;
                    }
                    if (sOutput == "")
                    {
                        foreach (CatchPhrase item in cpc)
                        {
                            nIndex.DivisibleCatchPhrase(item.Index, item.CatchWord, ref sOutput);
                        }
                    }
                    if (sOutput != "")
                        Console.WriteLine(string.Format(" -> {0}",sOutput));
                    else
                        Console.WriteLine(string.Format(" -> {0}",nIndex));
                }
               // Console.Write("Please input an integer number larger than 0: ");
            }
        }

为啥弄这么啰嗦,主要是考虑,式样变更的问题,以后基本不用改动。

FizzBuzz Ruby单线程

FizzBuzz Ruby单线程

Rosettacode.org在 Ruby中提供了这个出色的单行FizzBu​​zz解决方案.
1.upto(100){|n|puts'FizzBuzz '[i=n**4%-15,i+13]||n}

麻烦的是,我不明白.令我困惑的部分是“4模数-15的力量”.有没有人有解释或参考解释?我想用这种方法在其他问题中选择子串.
有关FizzBu​​zz的更多信息,请参阅[https://rosettacode.org/wiki/FizzBuzz]

解决方法

我不知道他们是如何发现提升到第四种力量的,但-15是因为FizzBu​​zz处理3的倍数或5的倍数或3和5的倍数(即15的倍数)……然后否定它最终与负面指数很好地合作.我们可以看到它适用于 Modular Exponentiation.那里的内存效率方法部分说:

c mod m = (a ⋅ b) mod m
c mod m = [(a mod m) ⋅ (b mod m)] mod m

在我们的例子中,c是我们的n,所以我们有

c ** 4 % m

使用law of exponents,我们知道(c ** e1)*(c ** e2)= c **(e1 e2),所以c ** 4 =(c ** 2)*(c ** 2),所以我们现在有一个a和ab,它们都是c ** 2.因此:

(c ** 4) % m = ((c ** 2) * (c ** 2)) % m
             = (((c ** 2) % m) * ((c ** 2) % m)) % m
             = (((c ** 2) % m) ** 2) % m

并按照相同的步骤再次:

(c ** 2) % m = (c * c) % m
             = ((c % m) * (c % m)) % m
             = ((c % m) ** 2) % m

最后:

(c ** 4) % m = ((((c % m) ** 2) % m) ** 2) % m

当m = -15时,c%m的唯一值是(-14..0),我们可以构建一个简单的表来查看.由于我们只对模数的结果进行操作,我们只需要能够证明这15个数字有效:

c%m    **2     %m    **2     %m
-14 => 196 => -14 => 196 => -14
-13 => 169 => -11 => 121 => -14
-12 => 144 => -06 =>  36 => -09
-11 => 121 => -14 => 196 => -14
-10 => 100 => -05 =>  25 => -05
-09 =>  81 => -09 =>  81 => -09
-08 =>  64 => -11 => 121 => -14
-07 =>  49 => -11 => 121 => -14
-06 =>  36 => -09 =>  81 => -09
-05 =>  25 => -05 =>  25 => -05
-04 =>  16 => -14 => 196 => -14
-03 =>   9 => -06 =>  36 => -09
-02 =>   4 => -11 => 121 => -14
-01 =>   1 => -14 => 196 => -14
 00 =>   0 =>  00 =>   0 =>  00

现在,查看我们的表,3的所有倍数的值是-09,所有5的倍数的值是-05,而3和5的倍数的值被设置为00;其他一切都是-14(如果我们使用15而不是-15,我们将分别有6,10,0和1,并且需要查找将其转换为字符串索引).使用字符串’FizzBu​​zz’为String#[]的start参数插入这些内容,可以为我们提供:

'FizzBuzz '[-9] # => 'F'
'FizzBuzz '[-5] # => 'B'
'FizzBuzz '[0]  # => 'F'
'FizzBuzz '[-14]# => nil

并为这些数字添加13以获得长度:

'FizzBuzz '[-9,4]   # => "Fizz"
'FizzBuzz '[-5,8]   # => "Buzz "
'FizzBuzz '[0,13]   # => "FizzBuzz "
'FizzBuzz '[-14,-1] # => nil

FizzBuzz 面试问题

FizzBuzz 面试问题

之前看到这个问题,写一个程序打印 1 到 100 这些数字。但是遇到数字为 3 的倍数的时候,打印 “Fizz” 替代数字,5 的倍数用 “Buzz” 代替,既是 3 的倍数又是 5 的倍数打印 “FizzBuzz”。

for(i=0;++i<101;console.log(i%5?f||i:f+''Buzz''))f=i%3?'''':''Fizz''

这是别人的实现,一时还没看懂,后来就自己折腾,

var y=[];
for(i=1;i<101;i++){
    if(!(i%3)&&!(i%5)){y.push(''FizzBuzz'');}
    else if(!(i%3)){y.push(''Fizz'');}
    else if(!(i%5)){y.push(''Buzz'');}
    else {y.push(i);}
}
console.log(y);

估计就是这个意思。

FizzBuzzWhizz

FizzBuzzWhizz

FizzBuzz是英国学校里常玩的游戏,从1数到100,如果遇见了3的倍数要说Fizz,5的倍数到说Buzz,如果即是3的倍数又是5的倍数要说FizzBuzz。
在这篇文章里
Why Can''t Programmers.. Program? 说200个程序员里有199个不能在几分钟内写出这段程序来,其中不乏拥有硕士和博士学位的人。

有个面试题就是以FizzBuzz作为题目,增加了一个Whizz的规则,如下。

1.首先说出三个不同的特殊数,要求必须是个位数,比如3、5、7。

2.让所有学生拍成一队,然后按顺序报数。

3.学生报数时,如果所报数字是第一个特殊数(3)的倍数,那么不能说该数字,而要说Fizz;如果所报数字是第二个特殊数(5)的倍数,那么要说Buzz;如果所报数字是第三个特殊数(7)的倍数,那么要说Whizz。

4.学生报数时,如果所报数字同时是两个特殊数的倍数情况下,也要特殊处理。比如第一个特殊数和第二个特殊数的倍数,那么不能说该数字,而是要说FizzBuzz,以此类推。如果同时是三个特殊数的倍数,那么要说FizzBuzzWhizz。

5.学生报数时,如果所报数字包含了第一个特殊数,那么也不能说该数字,而是要说相应的单词,比如本例中第一个特殊数是3,那么要报13的同学应该说Fizz。如果数字中包含了第一个特殊数,那么忽略规则3和规则4,比如要报35的同学只报Fizz,不报BuzzWhizz。


@echo off && setlocal enabledelayedexpansion
color 0A && cls
set /p n1=number1:  && set /p n2=number2:  && set /p n3=number3:  
for /l %%i in (1,1,100) do (
set sxx1=&& set /a "tp1=%%i %% n1" && set /a "tp2=%%i %% n2" && set /a "tp3=%%i %% n3"
echo %%i|findstr %n1% >nul 2>nul && set /a x=1 || set /a x=0
if !tp1! equ 0 (set "sxx1=!sxx1!Fizz")
if !tp2! equ 0 (set "sxx1=!sxx1!Buzz")
if !tp3! equ 0 (set "sxx1=!sxx1!Whizz")
if !x! equ 1 (set "sxx1=Fizz")
if not defined sxx1 (set "sxx1=%%i")
echo !sxx1!
) 
pause>nul





我们今天的关于参与了一下ThoughtWorks面试题:FizzBuzzthoughtworks offer的分享就到这里,谢谢您的阅读,如果想了解更多关于C# 版拉钩题目答案 FizzBuzzWhizz、FizzBuzz Ruby单线程、FizzBuzz 面试问题、FizzBuzzWhizz的相关信息,可以在本站进行搜索。

本文标签: