摘要: Template 模式是很简单模式,但是也应用很广的模式。Template 是采用继承的方式实现算法的异构,其关键点就是将通用算法封装在抽象基类中,并将不同的算法细节放到子类中实现。Template 模式获得一种反向控制结构效果, 这也是面向对象系统的分析和设计中一个原则 DIP(依赖倒置:Dependency Inversion Principles) 。其含义就是父类调用子类的操作(高层模块调用低层模块的操作) ,低层模块实现高层模块声明的接口。这样控制权在父类(高层模块) ,低层模块反而要依赖高层模块。 阅读全文
posted @ 2014-05-15 14:24 月轩 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 在字符串中找出第一个只出现一次的字符。如输入:“aabcdc”,则输出b 。 思路:我们可以把数组当做一个简单的哈希表来用,把每个字母的ASCII码值作为在数组中的位置(下标),数组中存储的是该字符出现的次数。这样我们就创建了一个以字符ASCII码为健值的哈希表。 阅读全文
posted @ 2014-05-14 20:31 月轩 阅读(145) 评论(0) 推荐(0) 编辑
摘要: '\0'是C++中字符串的结尾标志,存储在字符串的结尾。 阅读全文
posted @ 2014-05-14 19:45 月轩 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 只包含因子2,3,5的数称作丑数。要求按从小到大的顺序输出指定数量的丑数。 有2中方法: 第一种:用穷举法,从最小的1开始判断穷举,是丑数就输出,否则继续循环判断。判断的方法是:如果一个数能被2整除,我们把他连续除以2;如果能被3整除,我们把他连续除以3;如果能被5整除,我们把他连续除以5。如果最后得到的值为1,那么这个数就是丑数。 第二种:用空间换时间,创建一个数组,里面的数字是排好序的丑数,下一个丑数是前面丑数乘以2、3、5得到的大于当前最大丑数的最小一个数。和第一种思路相比,第二种思路不需要在非丑数上做任何计算,因此时间效率会明显提升,但增加了空间消耗。 阅读全文
posted @ 2014-05-14 17:31 月轩 阅读(370) 评论(0) 推荐(0) 编辑
摘要: 在以下集中情况下可以用 Proxy模式解决问题: 1)创建开销大的对象时候,比如显示一幅大的图片,我们将这个创建的过程交给代理去完成,GoF 称之为虚代理(Virtual Proxy); 2)为网络上的对象创建一个局部的本地代理,比如要操作一个网络上的一个对象(网络性能不好的时候,问题尤其突出) ,我们将这个操纵的过程交给一个代理去完成,GoF 称 之为远程代理(Remote Proxy); 3)对对象进行控制访问的时候,比如在 Jive 论坛中不同权限的用户(如管理员、普通用户等)将获得不同层次的操作权限,我们将这个工作交给一个代理去完成,GoF 称之为保 护代理(Protection Proxy)。 4)智能指针(Smart Pointer)。 阅读全文
posted @ 2014-05-14 12:40 月轩 阅读(372) 评论(0) 推荐(0) 编辑
摘要: 在软件系统开发中经常回会遇到这样的情况,你实现了一些接口(模块),而这些接口(模块)都分布在几个类中(比如 A和 B、C、D) :A中实现了一些接口,B 中实现一些接口(或者 A代表一个独立模块,B、C、D代表另一些独立模块) 。然后你的客户程序员 (使用你设计的开发人员) 只有很少的要知道你的不同接口到底是在那个类中实现的,绝大多数只是想简单的组合你的 A-D的类的接口,他并不想知道这些接口在哪里实现的。这时我们就要用到Facade 模式,Facade 模式在高层提供了一个统一的接口。 阅读全文
posted @ 2014-05-13 22:09 月轩 阅读(526) 评论(0) 推荐(0) 编辑
摘要: 我们先把数组中的整数转换成字符串,在函数compare中定义比较规则,并根据该规则用库函数qsort排列。最后把排序好的数组中的数字依次打印出来,就是该数组中数字拼接出来的最小数字。这种思路的时间复杂度是O(nlogn)。 阅读全文
posted @ 2014-05-13 16:33 月轩 阅读(216) 评论(0) 推荐(0) 编辑
摘要: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 阅读全文
posted @ 2014-05-13 16:23 月轩 阅读(546) 评论(0) 推荐(0) 编辑
摘要: 将数组转换为字符串······ 阅读全文
posted @ 2014-05-13 15:12 月轩 阅读(2942) 评论(0) 推荐(0) 编辑
摘要: 输入一个整数n,求从1到n这n个数的十进制表示中1出现的次数。例如:输入12,从1到12这些整数中包含1的数字有1,10,11(这里出现了2次)和12, 一共出现了5次。 有2种解法: 第一种:穷举法,从1到n,每个数判断一次,判断的方法是每位除以10,若余数为1,这说明改位含1。复杂度为O(n*logn)。 第二种:递归法,先求最高位出现1的个数,然后去掉最高位递归的求剩下位数中1出现的个数。时间复杂度是O(logn)。 阅读全文
posted @ 2014-05-13 11:51 月轩 阅读(331) 评论(1) 推荐(0) 编辑
摘要: 如果一个应用程序使用了太多的对象, 就会造成很大的存储开销。 特别是对于大量轻量级 (细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为每个字母创建一个对象的话,系统可能会因为大量的对象而造成存储开销的浪费。例如一个字母“a”在文档中出现了100000 次,而实际上我们可以让这一万个字母“a”共享一个对象,当然因为在不同的位置可能字母“a”有不同的显示效果(例如字体和大小等设置不同) ,在这种情况我们可以为将对象的状态分为“外部状态”和“内部状态” ,将可以被共享(不会变化)的状态作为内部状态存储在对象中,而外部对象(例如上面提到的字体、大小等)我们可以在适当的时候将外部对象最为参数传递给对象(例如在显示的时候,将字体、大小等信息传递给对象) 。 阅读全文
posted @ 2014-05-11 22:25 月轩 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 输入n个数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8 这8个数,则最小的4个数是1,2,3,4. 解法一:O(n)的算法,只有当我们可以修改输入数组时可用 解法二:O(nlogk)的算法,特别适合处理海量数据 阅读全文
posted @ 2014-05-10 20:53 月轩 阅读(153) 评论(0) 推荐(0) 编辑
摘要: set和multiset会根据特定的排序准则,自动将元素排序。两者不同处在于multiset允许元素重复而set不允许。 阅读全文
posted @ 2014-05-10 20:11 月轩 阅读(251) 评论(0) 推荐(0) 编辑
摘要: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 例如输入数组:{1,3,3,2,3,2,3,3,2}。由于2在数组中出现了5次,超过数组长度的一半,因此要输出2。 有两种解法: 第一种方法是基于快速排序算法的原理,边排序边判断是否符合输出条件。这种方法的代码我因为没有保存,在电脑蓝屏之后全部消失了·······~~~~(_)~~~~ 呜呜。 第二种方法是根据数组特点找出的算法,时间复杂度为O(n),且不用改变数组本身结构。 阅读全文
posted @ 2014-05-10 16:26 月轩 阅读(5943) 评论(0) 推荐(0) 编辑
摘要: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。 阅读全文
posted @ 2014-05-09 12:37 月轩 阅读(193) 评论(0) 推荐(0) 编辑