最近比较火的一道题(传送门),看见园友们的谈论(传送门1 传送门2),都是从1到100的扫描,我想说说的另一种想法。

可以把这道题转换成给100个人发纸牌的游戏,每人所报的就是纸牌上写的东西。

纸牌发放时有优先级的:

  1. Fizz
  2. FizzBuzzWhizz
  3. FizzBuzz
  4. FizzWhizz
  5. BuzzWhizz
  6. Fizz、Buzz、Whizz
  7. 自己的数字

有纸牌的同学就不再给了。

假设三个数字分别为a,b,c,那么以上的优先级的特点就是:

  1. Fizz(含有数字a的)
  2. FizzBuzzWhizz(a,b,c的最小公倍数的整数倍)
  3. FizzBuzz(a,b的最小公倍数的整数倍)
  4. FizzWhizz(a,c的最小公倍数的整数倍)
  5. BuzzWhizz(b,c的最小公倍数的整数倍)
  6. Fizz、Buzz、Whizz(a,b,c的整数倍)
  7. 自己的数字(剩下的)

10以内的最小公倍数比较好计算,也不用从1到100的扫描,感觉会更快一些。

文艺青年的代码做了一下对比:

附源码(有点乱,多担待):

    class Program
{
static void Main(string[] args)
{
//string[] s1 = Console.ReadLine().Split(',');
Test("3,5,7");
Test("2,4,8");
Test("3,6,8");
Console.ReadKey();
} static void Test(string str)
{
Console.WriteLine(str);
string[] s1 = str.Split(',');
int[] s2 = new int[] { int.Parse(s1[]), int.Parse(s1[]), int.Parse(s1[]) };
string[] r1 = Test1(s2);
string[] r2 = Test2(s2);
bool flag = true;
for (int i = ; i < ; i++)
{
if (r1[i] != r2[i])
{
flag = false;
break;
}
}
if(flag)
{
Console.WriteLine("结果相等");
}
else
{
Console.WriteLine("结果不相等");
} DateTime dt = DateTime.Now;
for (int i = ; i < ; i++)
{
Test1(s2);
}
TimeSpan ts = DateTime.Now - dt;
Console.WriteLine("文艺青年耗时:"+ts.TotalMilliseconds); DateTime dt2 = DateTime.Now;
for (int i = ; i < ; i++)
{
Test2(s2);
}
TimeSpan ts2 = DateTime.Now - dt2;
Console.WriteLine("屌丝青年耗时:" + ts2.TotalMilliseconds);
Console.WriteLine();
} private static string[] Test1(int[] a)
{
string[] result = new string[];
for (int i = ; i <= ; i++)
{
result[i - ] = (i % a[] == ? "Fizz" : "") + (i % a[] == ? "Buzz" : "") + (i % a[] == ? "Whizz" : "") + ((i % a[] != && i % a[] != && i % a[] != ) ? i.ToString() : "");
}
for (int i = ; i < ; i++)
{
result[a[] * + i - ] = result[i * + a[] - ] = "Fizz";
}
return result;
} private static string[] Test2(int[] a)
{
string[] result = new string[];
for (int i = ; i < ; i++)
{
result[a[] * + i - ] = result[i * + a[] - ] = "Fizz";
} comp(result, nlcm(a, ), "FizzBuzzWhizz"); comp(result, lcm(a[], a[]), "FizzBuzz");
comp(result, lcm(a[], a[]), "FizzWhizz");
comp(result, lcm(a[], a[]), "BuzzWhizz"); comp(result, a[], "Fizz");
comp(result, a[], "Buzz");
comp(result, a[], "Whizz"); for (int i = ; i <= ; i++)
{
if (string.IsNullOrEmpty(result[i - ]))
{
result[i - ] = i.ToString();
}
}
return result;
} static void comp(string[] result, int temp, string str)
{
for (int i = ; i * temp <= ; i++)
{
if (string.IsNullOrEmpty(result[i * temp - ]))
{
result[i * temp - ] = str;
}
}
} static int gcd(int a, int b)
{
if (a < b)
swap(ref a, ref b);
if (b == )
return a;
else
return gcd(b, a % b);
} private static void swap(ref int a, ref int b)
{
int c = a;
a = b;
b = c;
} static int ngcd(int[] a, int n)
{
if (n == ) return a[];
return gcd(a[n - ], ngcd(a, n - ));
} static int lcm(int a, int b)
{
return a * b / gcd(a, b);
} static int nlcm(int[] a, int n)
{
if (n == )
return a[];
else
return lcm(a[n - ], nlcm(a, n - ));
}
}

还可以再优化,抛砖引玉吧!

FizzBuzzWhizz游戏的高效解法的更多相关文章

  1. ThoughtWorks代码挑战——FizzBuzzWhizz游戏 通用高速版(C/C++ & C#)

    最早看到这个题目是从@ 程序媛想事儿(Alexia) 的 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏 开始的,然后这几天陆陆续续有N个小伙伴发表了自己的文章 ...

  2. ICG游戏:尼姆游戏异或解法的证明

    描述: 尼姆博奕(Nimm Game),有n堆石子,每堆石子有若干石子,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限.取走最后石子的人获胜. 标准解法: 判断: 先计算先手是必胜还是 ...

  3. 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏(C#解法)

    原题 看到那么多人看到前面这么糟粕的代码各种不忍直视后,楼主还是把最终实现放在页首吧.             Console.WriteLine("说出三个不同的特殊数,用','隔开 &q ...

  4. 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏

    最近互联网招聘平台拉勾网在五一期间推出个“最难面试的IT公司”代码挑战活动,评选出了5个最难面试的IT公司,即:ThoughtWorks.Google.Unisys.Rackspace.Cypress ...

  5. 最艰难的采访IT公司ThoughtWorks代码挑战——FizzBuzzWhizz游戏

    最近的互联网招聘平台拉勾网在五月推出了"最艰难的采访IT公司"码挑战活动,评选出了5个最难面试的IT公司,即:ThoughtWorks.Google.Unisys.Rackspac ...

  6. 2个集合比较——最高效解法(Java实现)

    优点:时间复杂度为O(n)级别: 缺点:只适用于Int,以及Int的数字不能过大,集合元素数量不能过多. 理论分析: 两个集合的元素之和以及之积相同则,这两个集合相等.(前提是两个集合的数量一致) 证 ...

  7. LeetCode283移动零问题java高效解法

    一.题目: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 1.必须 ...

  8. ThoughtWorks代码挑战——FizzBuzzWhizz

    很久没发表过文章了,今天看到一篇文章 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏(C#解法) 看到LZ的2B青年代码,实在是惨不忍睹,故写篇文章来探讨下这类 ...

  9. 关于今天很热的--FizzBuzzWhizz

    今天早上到现在看到了3篇关于FizzBuzzWhizz的问题,第一篇是@程序媛想事儿(Alexia)[最难面试的IT公司之ThoughtWorks代码挑战--FizzBuzzWhizz游戏]其实题目不 ...

随机推荐

  1. iOS书写高质量代码之耦合的处理

    原创 2016-12-26 MrPeak MrPeak杂货铺 耦合是每个程序员都必须面对的话题,也是容易被忽视的存在,怎么处理耦合关系到我们最后的代码质量.今天Peak君和大家聊聊耦合这个基本功话题, ...

  2. eclipse工具常用快捷键总结

    1.  ctrl + shift + r  可以根据类名快速找到你所需要的类名称 2.  ctrl + shift + i  debug的时候可以查看代码的值 3.  ctrl + shift + f ...

  3. spring-boot 文件上传获取不到File原因,MultipartHttpServletRequest.getFiles为空

    以下是spring-boot的处理方式,其他可参考处理具体问题:1.CommonsMultipartResolver解析不到request中的文件流2.Controller方法参数MultipartH ...

  4. Node的express框架安装

    第一步:在cmd命令行下执行npm install -g express,安装全局的express. 第二步:在命令行中输入express,如果出现express不是内部命令时, 输入npm inst ...

  5. Fight my work!

    来这个公司第一天工作, 上来就是装ubantu系统,对于玩linux玩的不熟的我.还是相当吃力的, 反正有问题尝试着自己解决,不会就问, 压力还是很大了. 学了一下企业的历史,理念等相关信息,也没重点 ...

  6. PPT演示快捷键

    序号  快捷键作用  快捷键 1  从头开始放映  Ctrl+F5 2  从当前页开始放映  Shift+F5 3  隐藏/显示鼠标指针  Ctrl+H/U 4  标记笔  Ctrl+P 5  荧光笔 ...

  7. 搜索引擎广告过滤Chrome插件

    搜索广告屏蔽Chrome插件:自动过滤:百度,360,搜狗,google,bing的搜索广告,让魏则西的悲剧不再重演.珍爱生命,远离搜索广告! 下载:FuckAd.zip 安装:方法自行百度. 关闭百 ...

  8. 创建Unity3D的MacOS Plugin的正确姿势

    http://www.tedlindstrom.se/how-to-link-dylibs-into-unity3d/ I was roaming around the net looking for ...

  9. git 的基本使用

    git 的使用步骤: 1. 新建一个文件夹,然后进入终端, 2. cd <文件夹路径>  ——->进入当前目录: 2.psw    ————>查看当前路径 3.git init ...

  10. VS低版本打开高版本解决方案(如08打开10、12、13版本vs编译的项目)

    一.vs2005打开vs2008编译的项目:1.用记事本打开sln文件,将: Microsoft Visual Studio Solution File, Format Version 10.00 # ...