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

可以把这道题转换成给100个人发纸牌的游戏,每人所报的就是纸牌上写的东西。
纸牌发放时有优先级的:
- Fizz
- FizzBuzzWhizz
- FizzBuzz
- FizzWhizz
- BuzzWhizz
- Fizz、Buzz、Whizz
- 自己的数字
有纸牌的同学就不再给了。
假设三个数字分别为a,b,c,那么以上的优先级的特点就是:
- Fizz(含有数字a的)
- FizzBuzzWhizz(a,b,c的最小公倍数的整数倍)
- FizzBuzz(a,b的最小公倍数的整数倍)
- FizzWhizz(a,c的最小公倍数的整数倍)
- BuzzWhizz(b,c的最小公倍数的整数倍)
- Fizz、Buzz、Whizz(a,b,c的整数倍)
- 自己的数字(剩下的)
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游戏的高效解法的更多相关文章
- ThoughtWorks代码挑战——FizzBuzzWhizz游戏 通用高速版(C/C++ & C#)
最早看到这个题目是从@ 程序媛想事儿(Alexia) 的 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏 开始的,然后这几天陆陆续续有N个小伙伴发表了自己的文章 ...
- ICG游戏:尼姆游戏异或解法的证明
描述: 尼姆博奕(Nimm Game),有n堆石子,每堆石子有若干石子,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限.取走最后石子的人获胜. 标准解法: 判断: 先计算先手是必胜还是 ...
- 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏(C#解法)
原题 看到那么多人看到前面这么糟粕的代码各种不忍直视后,楼主还是把最终实现放在页首吧. Console.WriteLine("说出三个不同的特殊数,用','隔开 &q ...
- 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏
最近互联网招聘平台拉勾网在五一期间推出个“最难面试的IT公司”代码挑战活动,评选出了5个最难面试的IT公司,即:ThoughtWorks.Google.Unisys.Rackspace.Cypress ...
- 最艰难的采访IT公司ThoughtWorks代码挑战——FizzBuzzWhizz游戏
最近的互联网招聘平台拉勾网在五月推出了"最艰难的采访IT公司"码挑战活动,评选出了5个最难面试的IT公司,即:ThoughtWorks.Google.Unisys.Rackspac ...
- 2个集合比较——最高效解法(Java实现)
优点:时间复杂度为O(n)级别: 缺点:只适用于Int,以及Int的数字不能过大,集合元素数量不能过多. 理论分析: 两个集合的元素之和以及之积相同则,这两个集合相等.(前提是两个集合的数量一致) 证 ...
- LeetCode283移动零问题java高效解法
一.题目: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 1.必须 ...
- ThoughtWorks代码挑战——FizzBuzzWhizz
很久没发表过文章了,今天看到一篇文章 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏(C#解法) 看到LZ的2B青年代码,实在是惨不忍睹,故写篇文章来探讨下这类 ...
- 关于今天很热的--FizzBuzzWhizz
今天早上到现在看到了3篇关于FizzBuzzWhizz的问题,第一篇是@程序媛想事儿(Alexia)[最难面试的IT公司之ThoughtWorks代码挑战--FizzBuzzWhizz游戏]其实题目不 ...
随机推荐
- js打印对象数组信息
function writeObj(obj){ var description = ""; for(var i in obj){ var property=obj[i]; desc ...
- 给DOM生成的元素添加事件
问题:通过js给页面添加新元素,并给该元素添加绑定事件,但新添加的元素上却没有绑定任何事件. 常见例子:在处理表格的时候,每行行末有个删除按钮,如下图.点击删除按钮的时候删除这一行. //html部分 ...
- Delphi的分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同
转载自:http://www.cnblogs.com/qiusl/p/4028437.html?utm_source=tuicool 我估摸着内存分配+释放是个基础的函数,有些人可能没注意此类函数或细 ...
- 父元素相对定位后,子元素在ie下被覆盖的问题!
<div id="append_parent" style="position: relative;"> <div id="zoom ...
- Java面试连环炮问题收集记录贴【JVM方面】
写这类文章是为了记录下网上看到的/自己经历的一些一环扣一环的面试问题,一方面提高自己的理论知识,另外一方面也给自己去参加面试或面试他人提供点参考和帮助. 问题一: 为什么一个对象会被GC? 对象在进行 ...
- 进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶
Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...
- 对rxandroid的简单理解
最近发现这个rxandroid挺火的,我就研究了一下,还真的挺不错. 首先在说之前可能很多人会和我刚刚学习的时候一样有很多疑问,如: 1:rxandroid是什么东西? 2:rxandroid能干嘛? ...
- [转载] 构造linux 系统下免密码ssh登陆 _How to establish password-less login with SSH
In present (post production) IT infrastructure many different workstations, servers etc. have to be ...
- 大家都在用PDA条码扫描枪管理企业仓库 PDA无线数据采集程序
PDA数据采集器又称之为手持终端,这些都是用于扫描货物条码统计数据用的,PDA扫描枪有效提高企业仓库管理,在仓库管理中引入条码技术,对仓库的到货检验.入库.出库.调拨.移库移位.库存盘点等各个作业环节 ...
- PHP unset()函数销毁变量 但没有实现释放内存
<?PHP $a = "hello";$b = &$a;unset( $b );echo $a; // 输出 helloecho $b; // 报错$b = &quo ...