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游戏]其实题目不 ...
随机推荐
- JAVA的模式对话框和非模式对话框
周末的时候,一位网友让我帮他把他的无模式对话框改成有模式对话框. 界面是由swing制作的,都是JFrame,我从来没有接触过swing编程.大致的代码还是看的懂,很多都和C#很相似. 然后就去查资料 ...
- 创建Hello World程序(part-1)
写在前面: 2006年,刚上大学,班上有几个计算机文盲,1分钟打二十几个字都困难,很不幸,我就是其中的一个.强烈的自尊心驱使我不停恶补,翻遍了图书馆的计算机文化基础,知耻而后勇...后来,C语言居然考 ...
- Xcode最好用的日志打印方法
一般打印日志都是用的系统自带的NSLog来打印的,假如项目做完了,要上线了,这些打印的日志就会很浪费性能,网上有很多的解决办法,我也是感觉网上的还是有点不方便,所以就自己又修改了一下,分享给大家. 网 ...
- 【leetcode】House Robber
题目简述 You are a professional robber planning to rob houses along a street. Each house has a certain a ...
- (转) JAVA中如何设置图片(图标)自适应Jlable等组件的大小
一.问题: 一个程序,组件上设置某个图片作为图标,因为的label(应该说是组件)已经设定了固定大小, 所以再打开一些大图片时,超过组件大小的部分没显示出来,而小图片又没填充完整个组件 二.解决这个问 ...
- jquery中的ajax方法参数总是记不住,这里记录一下。
1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...
- ChannelHandler
ChannelHandler功能介绍 ChannelHandler类似于Servlet的Filter过滤器,负责对I/O事件或者I/O操作进行拦截和处理,它可以选择性地拦截和处理自己感兴趣的事件,也可 ...
- oracle(sql)基础篇系列(一)——基础select语句、常用sql函数、组函数、分组函数
花点时间整理下sql基础,温故而知新.文章的demo来自oracle自带的dept,emp,salgrade三张表.解锁scott用户,使用scott用户登录就可以看到自带的表. #使用ora ...
- JackRabbit的前世今生
题记 写这系列有点老调重弹的味道,比如ahuaxuan已经在他的博客里对于JackRabbit 1.0做了很详细的阐述.之所以再写,是因为JCR推出了JCR 2.0,个人觉得有必要将一些新的特性再罗列 ...
- json序列化及反序列化
/// <summary> /// 把对象序列化 JSON 字符串 /// </summary> /// <typeparam name="T"> ...