C++/C技术

摘要: 在《单链表操作——交换节点》的代码中,有一个Bug,就是当交换的是链表中相邻的两个节点的时候,程序会Down,原因是在交换节点操作中指针的修改引起的(只需要手工运行下程序就十分清楚了)。因此需要作一点修补,就是判断两个节点是否是相邻节点,再单独处理即可。阅读全文

posted @ 2005-08-11 22:00 k_eckel's mindview 阅读(694) | 评论 (1)  编辑 |

摘要: 单链表的交换节点的含义是:给定一个单链表,要求交换其中的任意两个节点。注意这里链表的头节点是不参与节点交换的。这个看上去是比较简单,但是实现起来却还是需要一定的基本功。阅读全文

posted @ 2005-08-11 21:58 k_eckel's mindview 阅读(1280) | 评论 (1)  编辑 |

摘要: 子串匹配当然也可以使用不回溯的方式实现,这个算法是笔者在作一个模糊查询的实现的时候想到的,没有确认和通常算法的异同,可能是一个很平常的思想:)。实现的思想很简单:每次比较子串长度的大字符串,若相等则返回,否则在大字符串中的起始位置递进,直到大字符串结束。阅读全文

posted @ 2005-08-11 11:03 k_eckel's mindview 阅读(689) | 评论 (0)  编辑 |

摘要: 回溯法求解子串的过程为:依次遍历大字符串和子串,当发现不相等的时候就回溯到上次起始字符的下一个字符继续,并给子串起始位置清零。当遍历完整个大字符串(没有找到)或者遍历完子串(找到)则算法退出。阅读全文

posted @ 2005-08-11 09:37 k_eckel's mindview 阅读(871) | 评论 (0)  编辑 |

摘要: 网上看到一个面试题(据说是ATC的):写一个在一百万数字中求最大的10个数字的算法。这个问题的解决方案很多,显然考察的是算法的效率(因为基数一百万)。至少有以下几种解法:1)冒泡10次;2)用一个10个大小的数组保存最初10个元素,然后遍历,遇到比最小的大的元素就插入这个数组中,并去掉最小的元素。显然这两种解法的效率都不是特别合适。基于堆的算法应该是提供了一个较好的解决方案,构建大顶堆,取得第一个元素,然后循环10次即可达到题目要求。当然,直接使用基于堆的优先队列可以达到同样的目的。阅读全文

posted @ 2005-08-10 20:25 k_eckel's mindview 阅读(2320) | 评论 (0)  编辑 |

posted @ 2005-08-08 15:50 k_eckel's mindview 阅读(556) | 评论 (1)  编辑 |

摘要: 实际上你可以在VC IDE中设置命令行参数,方法为:Project->Settings->Debug->General:Program Arguments中输入参数即可。阅读全文

posted @ 2005-08-07 10:12 k_eckel's mindview 阅读(427) | 评论 (0)  编辑 |

摘要: Singleton模式可能可以说是最简单的设计模式了,其应用的场景和示例实在是没有太多可以再重复,但是以下的两个问题还是需要我们进一步的审视:阅读全文

posted @ 2005-08-06 16:00 k_eckel's mindview 阅读(1159) | 评论 (0)  编辑 |

posted @ 2005-08-05 00:24 k_eckel's mindview 阅读(5431) | 评论 (0)  编辑 |

posted @ 2005-08-04 22:58 k_eckel's mindview 阅读(4044) | 评论 (0)  编辑 |

摘要: 算法基于这样一种思想:将待移动的字符串从移动点分为a、b两个子串,逆转a,再逆转b,再逆转得到的整个字符串。即:(a’b’)’ = ba。阅读全文

posted @ 2005-08-04 13:30 k_eckel's mindview 阅读(523) | 评论 (3)  编辑 |

摘要: 在《GoF 23种设计模式模式解析附C++实现源码》和《设计模式解析之—Visitor模式》中,我给出了Visitor模式的诠释和示例实现源码。个人觉得例子和解析还是能够比较清晰地为学习和掌握Visitor模式提供一些信息,但是对于其中的一个重要知识没有很好地解释,这就是multi-dispatch(多分派),multi-dispatch(多分派)是Visitor模式的关键,实际上Visitor模式就是提供了一种multi-dispatch(多分派)中的double dispatch(双分派)的实现方式。阅读全文

posted @ 2005-08-02 14:48 k_eckel's mindview 阅读(985) | 评论 (0)  编辑 |

摘要: 在《GoF 23种设计模式模式解析附C++实现源码》中,我已经给出了对于State模式的简化诠释并给出了一个C++实现的例子。再次审视以前的代码,发现有些地方还是有些生涩,并且感觉示例代码没有能够很好地诠释要表达的意思。最近因为项目中用到了一些State模式相关的知识,对State模式进行了一个重新的审视,并附上用C++实现的例子,供学习交流。阅读全文

posted @ 2005-07-31 12:43 k_eckel's mindview 阅读(1032) | 评论 (1)  编辑 |

摘要: 二叉树前序遍历的递归和非递归实现阅读全文

posted @ 2005-07-30 16:31 k_eckel's mindview 阅读(2646) | 评论 (1)  编辑 |

摘要: 这也是网络流传的Microsoft的面试题目之一:“怎样从顶部开始逐层打印二叉树结点数据?请编程”。这个题目实际上很简单,采用队列的方式很容易可以实现:阅读全文

posted @ 2005-07-22 13:28 k_eckel's mindview 阅读(5468) | 评论 (10)  编辑 |

摘要: 给定一个字符串,要求给出其所有的排列。例如给出“ABC”,则其排列有:ABC,ACB,BAC,BCA,CAB,CBA 6种。这是一个看似简单,但是实现起来却不是很容易的问题。记得去年一个师姐去参加某NB公司的笔试的时候就被这样一个问题给整了,更加郁闷的是别人是把程序都给出了,给出了输入,要给出输出。结果是倒弄了半天,最后发现是求解全排列,郁闷不已!阅读全文

posted @ 2005-07-21 11:00 k_eckel's mindview 阅读(1336) | 评论 (5)  编辑 |

摘要: 没有人会怀疑实现交换两个整数(或者字符等)的程序是很简单的,但是很多人也会被这样的一个问题郁闷:不用任何中间变量,实现两个整数的交换。在《微软面试题——反转字符串》中列出了比较常见的做法,但是这种Hack技巧却带来了后遗症。阅读全文

posted @ 2005-07-21 10:36 k_eckel's mindview 阅读(453) | 评论 (6)  编辑 |

摘要: 前几天和一位老师聊天,老师是一位很实干的老师,刚从英国回来。说到去给一个公司招聘面试时候,对着10几个计算机专业的研究生让写一个求最大公约数的欧几里德算法,连思想都给出了,竟然…..。我无语,想想自己在很多时候也对基础的简单的经典的算法有些忽略了,心有余悸。

欧几里德算法也就是辗转相除法,有着2000年的历史了。欧几里德算法依据的算法理论是一个定理:gcd(a,b) = gcd(b,a mod b)。
阅读全文

posted @ 2005-07-20 10:01 k_eckel's mindview 阅读(2738) | 评论 (5)  编辑 |

摘要: 网络流传的Microsoft的面试题目之一:“编写反转字符串的程序,要求优化速度、优化空间”。因为最近一直很多关注算法方面的实践和研究,因此对这个问题进行了一些思考,给出了5种实现方法(有两种解法相关性比较大)。阅读全文

posted @ 2005-07-19 15:53 k_eckel's mindview 阅读(6675) | 评论 (0)  编辑 |

摘要: 单链表的逆转过程的关键是3个指针:一个记录当前逆转节点的前一个节点,一个记录当前逆转节点的下一个节点,另外一个则记录当前的逆转节点。阅读全文

posted @ 2005-07-19 09:49 k_eckel's mindview 阅读(1852) | 评论 (1)  编辑 |

摘要: 快速排序的主要思想就是:将待排序数组以某一个元素为阈值分为两个子列,一个子列包含所有比改阈值小的元素,另一个子列反之。这样只要将这两个子列排好序,整个数组也就排好序了。这里有一个关键的子过程就是划分的过程Partition,一般可以选择数组中任意的元素作为划分阈值,这里选择的是数组中最右端的元素。

Partition使用了二分查找类似的思想:使用两个索引器从数组的两端进行遍历,左边的索引器遇到比阈值大的元素停止,右边的索引器遇到比自己小的元素停止,然后交换这两个元素,依次循环。这样数组就划分为了比该阈值大和小(含等于)两个子列了。
阅读全文

posted @ 2005-07-17 11:09 k_eckel's mindview 阅读(349) | 评论 (2)  编辑 |

posted @ 2005-07-17 10:57 k_eckel's mindview 阅读(505) | 评论 (0)  编辑 |

摘要: 冒泡排序和选择排序是排序算法中比较简单和容易实现的算法。冒泡排序的思想为:每一次排序过程,通过相邻元素的交换,将当前没有排好序中的最大(小)移到数组的最右(左)端。而选择排序的思想也很直观:每一次排序过程,我们获取当前没有排好序中的最大(小)的元素和数组最右(左)端的元素交换,循环这个过程即可实现对整个数组排序。两者的实现源码为:阅读全文

posted @ 2005-07-17 10:50 k_eckel's mindview 阅读(648) | 评论 (1)  编辑 |

摘要: 插入排序的思想很简单:假设前N-1个数据已经排好序了,第N个数据插到前面已经排好序的数组中。这和生活中一件事情有着异曲同工之妙:玩扑克牌的时候,很多人(包括我)都会按照花色从大小(或反之)进行排序,而每次再拿到新的牌,则插入到合适的位置,其实这就是插入排序的思想。

因此插入排序的过程可以分为两个步骤:1)找到新元素的插入位置;2)将将元素插入到1)中确定的位置,这就需要移动元素了。1)中确定位置我们可以采用简单的顺序遍历的方法得到,但是注意到由于前N-1个元素已经排好序,因此可以使用二分查找的方式实现。前者就是普通的插入排序,而后者就是二分插入排序。
阅读全文

posted @ 2005-07-17 10:29 k_eckel's mindview 阅读(246) | 评论 (0)  编辑 |

posted @ 2005-07-16 17:11 k_eckel's mindview 阅读(206) | 评论 (0)  编辑 |

摘要: Monostate模式——兼谈Singleton模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 21:28 k_eckel's mindview 阅读(486) | 评论 (1)  编辑 |

摘要: 近读程序员第六期,有读者致信,言及模式必须有场景,空谈无用。其言词之激烈,语态之急切,实不为讨论、商榷姿态。然立论虽似有理,实需商榷,识之。模式范畴太大,这里就笔者熟悉的设计模式做一讨论,供参考。阅读全文

posted @ 2005-07-08 21:26 k_eckel's mindview 阅读(288) | 评论 (0)  编辑 |

摘要: 因为如果没有梦想,就不会有激情,如果没有激情,就难以体味淋漓畅快的人生。阅读全文

posted @ 2005-07-08 21:24 k_eckel's mindview 阅读(659) | 评论 (0)  编辑 |

摘要: 设计模式体现的是一种思想,而思想则是指导行为的一切,理解和掌握了设计模式,并不是说记住了23种(或更多)设计场景和解决策略(实际上这也是很重要的一笔财富),实际接受的是一种思想的熏陶和洗礼,等这种思想融入到了你的思想中后,你就会不自觉地使用这种思想去进行你的设计和开发,这一切才是最重要的。阅读全文

posted @ 2005-07-08 21:20 k_eckel's mindview 阅读(267) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Interpreter模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 21:18 k_eckel's mindview 阅读(633) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Prototype模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 21:17 k_eckel's mindview 阅读(353) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Iterator模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 21:16 k_eckel's mindview 阅读(438) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Builder模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 21:14 k_eckel's mindview 阅读(524) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Command模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 21:13 k_eckel's mindview 阅读(891) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Chain of Responsibility模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 21:12 k_eckel's mindview 阅读(425) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Mediator模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 21:10 k_eckel's mindview 阅读(441) | 评论 (1)  编辑 |

摘要: 设计模式解析之——Adapter模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 21:09 k_eckel's mindview 阅读(531) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Singleton模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 21:07 k_eckel's mindview 阅读(240) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Decorator模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 21:05 k_eckel's mindview 阅读(589) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Composite模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 21:03 k_eckel's mindview 阅读(423) | 评论 (0)  编辑 |

摘要: 设计模式解析之——AbstractFactory模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 21:02 k_eckel's mindview 阅读(268) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Observer模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 21:00 k_eckel's mindview 阅读(726) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Strategy模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 20:58 k_eckel's mindview 阅读(324) | 评论 (1)  编辑 |

摘要: 设计模式解析之——Flyweight模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 20:56 k_eckel's mindview 阅读(275) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Bridge 模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 20:54 k_eckel's mindview 阅读(491) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Proxy模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 20:52 k_eckel's mindview 阅读(443) | 评论 (0)  编辑 |

摘要: 设计模式解析之——State模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 20:51 k_eckel's mindview 阅读(273) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Memento模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 20:49 k_eckel's mindview 阅读(313) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Factory模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 20:46 k_eckel's mindview 阅读(432) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Visitor模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 20:44 k_eckel's mindview 阅读(529) | 评论 (0)  编辑 |

摘要: 设计模式解析之——Facade模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 20:41 k_eckel's mindview 阅读(2070) | 评论 (5)  编辑 |

摘要: 设计模式解析之——Template模式(k_eckel转自微软高校博客K_eckel's mindview)。阅读全文

posted @ 2005-07-08 20:33 k_eckel's mindview 阅读(205) | 评论 (0)  编辑 |

摘要: 同学在MSN CDC电话面试(可惜我在被面试的时候全然没有这么具体的问题了:))中的一个题目:将16进制的字符串转化为10进制数字,例如“1A”,则对应26。题目很简单,实现起来也容易,依稀记得C里面有函数可以转化。刚好很久前有一个工作了的同学问起,自是给了一个方案。昨晚(050703)实在无聊,于是本着“写过才是自己的原则”,写了一个实现,其中对于16进制字符串非法的处理不是很好(返回-1),但是已经不想改了。(自己写的时候才知道原来Horner法则的实现都生疏了不少,思及最近多在模式、架构和软件过程、文档上花时间(项目使然,也没有办法:)),实在不能忘本了。)。阅读全文

posted @ 2005-07-08 13:21 k_eckel's mindview 阅读(918) | 评论 (1)  编辑 |

摘要: 项目开发调试的时候,经常要输出一些关键的数据信息进行分析,综合起来主要有以下几种方式。阅读全文

posted @ 2005-07-08 13:14 k_eckel's mindview 阅读(1556) | 评论 (0)  编辑 |