代码优化如做游戏一样有趣
来源:互联网 发布:淘宝上买号怎么领取 编辑:程序博客网 时间:2024/04/30 16:30
认认真真地写好一段代码,写好一个函数,也是很有乐趣的一件事情。
1. 比如说对于这样一个小题目:
在一50人的队列中,从左至右报数,为单数者出列,其他人再从左至右报数,为单数者出列,直至剩下最后一人,问此人是初始队列中的第多少号?
意看到这个描述,那么当然有一种顺理成章的做法,如下所示:
namespace Exam01{ using System.Collections.Generic; /// <summary> /// TODO: Update summary. /// </summary> public class Utility { private List<int> numbers = new List<int>(); public Utility() { for (int i = 1; i <= 50; i++) { numbers.Add(i); } } public int Run() { while (numbers.Count > 1) { int start = ((numbers.Count >> 1) << 1) == numbers.Count ? numbers.Count - 1 : numbers.Count; for (int i = start - 1; i >= 0; i -= 2) { numbers.RemoveAt(i); } } return numbers[0]; } }}
这个做法显然不是最优的。
经过简单的分析,我们可以看到,每一轮去除单数元素后,每次得到的新的数列中,第一个元素的值是很有规律的。这个规律就是2的n次方,n从0开始取值。
所以上面的Run()函数我们优化为下面这样的:
public int Run() { int start = 1; int k = 50 >> 1; while (start <= k) { start <<= 1; } return start; }
再举两个代码优化的小例子:
2. 如何把月份转换成季度
先看一下某论坛帖子里面的代码:
public int ConvertMonthToQuarter(int month){ double f = Convert.ToDouble(month)/3f; if (f > Convert.ToInt32(f)) { return Convert.ToInt32(f) + 1; } return Convert.ToInt32(f);}
这段代码当然质量是惨不忍睹的。下面是我的优化:
/// <summary>/// Get quarter of the year by month value./// Notice: valid month range is [1 -- 12]/// </summary>/// <param name="month">month value.</param>/// <returns>quarter value of the year</returns>public int GetQuarterByMonth(int month){ if (month < 1 || month > 12) { string message = string.Format("Input parameter month ({0}) out of range[1 -- 12].", month); throw new ArgumentOutOfRangeException("month", message); } int q = month / 3; return q * 3 < month ? q + 1 : q;}
然后,略微一思考,进一步优化如下:
/// <summary>/// Get quarter of the year by month value./// Notice: valid month range is [1 -- 12]/// </summary>/// <param name="month">month value.</param>/// <returns>quarter value of the year</returns>public int GetQuarterByMonth(int month){ if (month < 1 || month > 12) { string message = string.Format("Input parameter month ({0}) out of range[1 -- 12].", month); throw new ArgumentOutOfRangeException("month", message); } return (month - 1) / 3 + 1;}
现在这个函数看起来终于像样了吧。
3. 获得本月份是本季度的第几个月
先看一下某论坛帖子里面的代码:
public int GetMonthOfQuarter(int month){ int num = month % 3; if (num == 0) { return 3; } return num;}
我对其优化如下:
/// <summary>/// Get month sequence of the quarter./// Notice: valid month range is [1 -- 12]/// </summary>/// <param name="month">month value.</param>/// <returns>month sequence of the quarter</returns>public int GetMonthSeqOfQuarter(int month){ if (month < 1 || month > 12) { string message = string.Format("Input parameter month ({0}) out of range[1 -- 12].", month); throw new ArgumentOutOfRangeException("month", message); } int k = (month - 1) / 3; return month - 3 * k;}
雕虫小技耳。但是也挺有意思。
- 代码优化如做游戏一样有趣
- 做个有趣的游戏
- 做网站如带孩子一样,需要精心呵护
- 如何用java做一个桌面游戏
- 【转】用 Unity 做 iPhone 游戏之代码优化个人总结
- 如何用github/gitlab做代码review
- 花钱如流水一样
- 我用代码做过的有趣的东西
- 一段有趣的C++代码 -C++和JAVA其实是一样的
- 如何用Unity和Cardboard做一款VR游戏
- 如何用C#源代码来检查一个牌类游戏牌的花色是否一样
- 可视化编程的游戏引擎让iOS游戏开发像做沙拉一样简单
- 有趣代码
- 搜索引擎优化-如何用CSS图片做背景
- 图片如幻灯片一样显示
- 如QQ一样的效果
- 如CSDN一样的分页
- 如CSDN一样的分页
- 恢复firefox关闭时保存标签页的提示。
- 在被窝里看书系列之《Windows PE 权威指南学习》笔记 第一章
- ubuntu12.04 中EMACS安装过程中关于crt*.o定位的问题
- 在被窝里看书系列之《Windows PE 权威指南学习》笔记 第二章
- sublime 看着太爽了!
- 代码优化如做游戏一样有趣
- JAVA 哈希表类 HashTable
- JSP编程,url中加斜杠和不加斜杠的区别(sendredirect,requestdispatcher,servlet,filter)
- 关于设计原则
- NYOJ 257 郁闷的C小加(一)(中缀式变后缀式)
- Ajax简单应用
- 关于visual studio 2010 与windows phone 的整合安装问题
- AJAX 简单应用(2)
- 如何学习dsp?