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游戏]其实题目不 ...
随机推荐
- iOS 之UIButton左文右图
对于button,当添加了图片时,默认是左图右文的 '[self.pageViewsLB setImage:[UIImage imageNamed:@"read"] forStat ...
- 创建cocos项目并打包
- c#_图表之zeGraph
关于图表控件: http://blog.csdn.net/sgear/article/details/1449025 其中zedGraph的基本方法及属性介绍: http://wenku.baidu. ...
- 【转】PHP的Trait 特性
Trait是在PHP5.4中加入的,它既不是接口也不是类.主要是为了解决单继承语言的限制.是PHP多重继承的一种解决方案.例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情 ...
- Docker上ubuntu新建用户的网络访问不通问题
背景 作为一个生命不息,折腾不止的码农.各种操作系统被我不知道搞崩了多少次,无数个夜晚连夜抢修数据,重装系统,那个累啊!! Option 1:备份.数据可以备份,配置可以备份,安装包可以备份.但是安装 ...
- oracle 11.2.0.4单实例文件系统安装与补丁
[TOC] 一,预安装处理 1.版本准备 操作系统:RHEL 6.5 数据库版本:Oracle 11.2.0.4 相关包:p13390677_112040_Linux-x86-64_1of7.zip ...
- 卸载oracle 11g grid软件
一,使用deinstall 同样,卸载grid软件在11g中也推出了了卸载工具deinstall卸载同卸载oracle数据库软件 具体可参考:Behaviour of the Oracle De-in ...
- 用python读写excel(xlrd、xlwt)
最近需要从多个excel表里面用各种方式整理一些数据,虽然说原来用过java做这类事情,但是由于最近在学python,所以当然就决定用python尝试一下了.发现python果然简洁很多.这里简单记录 ...
- 防止sql注入和sqlmap介绍
sql注入问题从WEB诞生到现在也一直没停过,各种大小公司都出现过sql注入问题,导致被拖库,然后存在社工库撞库等一系列影响. 防止sql注入个人理解最主要的就一点,那就是变量全部参数化,能根本的解决 ...
- EditText取消自动调用键盘事件(方法之一)
直接上代码,这只是其中一种方法: 重点在于是在该EditText的父空间中设置 <LinearLayout android:layout_width="match_parent&quo ...