最近比较火的一道题(传送门),看见园友们的谈论(传送门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. [Android Pro] 精确记录和恢复ListView滑动位置

    reference to : http://blog.csdn.net/welovesunflower/article/details/7926512 工作中遇到一个需求,对ListView某一项操作 ...

  2. Idea 快捷键

    Ctrl+Alt+T 选中代码块加try catch等常用快捷操作.如图: psvm+Tab键 快速创建main方法 pout+Tab键 快速打出System.out.println(); Ctrl+ ...

  3. CSS网页制作常用标签

    做了一个简单的网页,从布局到加内容,遇到了很多小问题.很多标签和属性都不会用或者忘记了.所以以此记录一下. 一.如何将边框四角变圆?(或做一个圆形) 顾名思义,如果要更改边框的角需要用到边框(bord ...

  4. UILabel 根据文本内容设置frame

    CGRect senderFrame = cell.senderLabel.frame;    CGRect creatAtFrame = cell.creatAtLabel.frame;    CG ...

  5. vim 加行号 和取消行号

    :set nu #是加行号 :set nonu #是去掉行号

  6. 【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】

    一.需求分析 日志数据在很多行业中都是非常敏感的数据,它们不能删除只能保存和查看,这样日志表就会越来越大,我们不可能永远让它无限制的增长下去,必须采取一种手段将数据分散开来.假设现在整个数据库需要保存 ...

  7. jsf组件对应表

    组件 标签 说明 UIForm form 表示 HTML表单元素 UIInput InputText 单行文本输入控件   inputTextarea 多行文本输入控件   InputSecret 密 ...

  8. DTMF三种模式(SIPINFO,RFC2833,INBAND)

    转自:http://www.tuicool.com/articles/n6Vb2iJ 1.DTMF(双音多频)定义:由高频音和低频音的两个正弦波合成表示数字按键(0~9 * # A B C D). 2 ...

  9. 10gRAC vip启动报错CRS-1006 CRS-0215

    为测试一个迁移方案,装了一套10g rac环境,可能是很久没有装过10g的RAC了,整个过程情况不断. 1.在把集群软件和数据库软件都装好之后,用crs_stat检测状态的时候,发现vip的状态不对, ...

  10. [译]:Xamarin.Android开发入门——Hello,Android深入理解

    返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...