对于参与了一下ThoughtWorks面试题:FizzBuzz感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍thoughtworksoffer,并为您提供关于C#版拉钩题目答案FizzBuzz
对于参与了一下ThoughtWorks面试题:FizzBuzz感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍thoughtworks offer,并为您提供关于C# 版拉钩题目答案 FizzBuzzWhizz、FizzBuzz Ruby单线程、FizzBuzz 面试问题、FizzBuzzWhizz的有用信息。
本文目录一览:- 参与了一下ThoughtWorks面试题:FizzBuzz(thoughtworks offer)
- C# 版拉钩题目答案 FizzBuzzWhizz
- FizzBuzz Ruby单线程
- FizzBuzz 面试问题
- FizzBuzzWhizz
参与了一下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
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 value, int 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 value, int 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 { get; set; }
public string CatchWord { get; set; }
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单线程
1.upto(100){|n|puts'FizzBuzz '[i=n**4%-15,i+13]||n}
麻烦的是,我不明白.令我困惑的部分是“4模数-15的力量”.有没有人有解释或参考解释?我想用这种方法在其他问题中选择子串.
有关FizzBuzz的更多信息,请参阅[https://rosettacode.org/wiki/FizzBuzz]
解决方法
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,并且需要查找将其转换为字符串索引).使用字符串’FizzBuzz’为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 面试问题
之前看到这个问题,写一个程序打印 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
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面试题:FizzBuzz和thoughtworks offer的分享就到这里,谢谢您的阅读,如果想了解更多关于C# 版拉钩题目答案 FizzBuzzWhizz、FizzBuzz Ruby单线程、FizzBuzz 面试问题、FizzBuzzWhizz的相关信息,可以在本站进行搜索。
本文标签: