摘要: 写一个函数,求俩个整数之和,要求函数体内不得使用+、-、*、/ 四则运算符合。看到题目,我们知道,现在只有位运算可以用了,那就用位运算吧。第一步:对2个数的每一位相加,但不进位,我们可以用异或运算完成。第二步:找到进位的位置,并计算进位的值,我们先用与运算可以找到位置,然后左移一位,得到进位的值(比... 阅读全文
posted @ 2014-05-26 21:14 月轩 阅读(314) 评论(1) 推荐(1) 编辑
摘要: C++函数后加关键字throw(something)限制,是对这个函数的异常安全性作出限制。void f() throw() 表示f不允许抛出任何异常,即f是异常安全的。void f() throw(...) 表示f可以抛出任何形式的异常。void f() throw(exceptionType);... 阅读全文
posted @ 2014-05-26 17:37 月轩 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 在介绍“ !”运算之前,我们要知道一个变量n,如果n>0,那么我们可以在逻辑上叫它“真”,如果n<=0 ,那么我们可以在逻辑上叫它“假”。n为真时,!n就为假(false),转换为整型值即为0;n为假时,!n就是真(true),转换为整型值即为1;看起来很简单,但是“ !” 运算有一个重要的用处,就... 阅读全文
posted @ 2014-05-26 16:46 月轩 阅读(1023) 评论(0) 推荐(0) 编辑
摘要: 把n个骰子扔在地上,所有骰子朝上的一面的点数之和为s。输入n,打印出s的所有可能的值和出现的概率。解法二:基于循环求骰子点数,比递归算法更加高端大气上档次具体代码如下,有详细注释。 1 ////////////////基于循环求骰子点数////////////////////////////////... 阅读全文
posted @ 2014-05-25 22:29 月轩 阅读(236) 评论(0) 推荐(0) 编辑
摘要: State模式中我们将状态逻辑和动作实现进行分离。允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类;在一个状态即将结束的时候启用下一个状态。 1 /////////state.h//////////////////////////////////////////////////... 阅读全文
posted @ 2014-05-25 16:36 月轩 阅读(315) 评论(0) 推荐(0) 编辑
摘要: 可以看到 Strategy 模式和 Template 模式解决了类似的问题,也正如在 Template 模式中分析的,Strategy模式和 Template 模式实际是实现一个抽象接口的两种方式:继承和组合之间的区别。要实现一个抽象接口,继承是一种方式:我们将抽象接口声明在基类中,将具体的实现放在... 阅读全文
posted @ 2014-05-20 21:59 月轩 阅读(346) 评论(0) 推荐(0) 编辑
摘要: 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。从使用角... 阅读全文
posted @ 2014-05-20 21:34 月轩 阅读(287) 评论(0) 推荐(0) 编辑
摘要: 把n个骰子扔在地上,所有骰子朝上的一面的点数之和为s。输入n,打印出s的所有可能的值和出现的概率。 解法一:基于递归求骰子点数。 阅读全文
posted @ 2014-05-20 20:25 月轩 阅读(315) 评论(0) 推荐(0) 编辑
摘要: 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。 菜鸟的写法是顺序扫描,时间复杂度是O(n2)。下面给出一种大牛的写法,时间复杂度只需O(n)。 阅读全文
posted @ 2014-05-19 22:51 月轩 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1). 例如:输入{2,7,3,10,3,2,5,5} , 输出 7 和 10 。 大家首先想到的是顺序扫描法,但是这种方法的时间复杂度是O(n2)。接着大家又会考虑用哈希表的方法,但是空间复杂度不是O(1)。 应该怎么做才能即满足时间复杂度是O(n)又满足空间复杂度是O(1)的要求呢? 我们可以想一想“异或”运算的一个性质。任何一个数字异或它自己都是0 , 那么我们依次异或数组中的每一个数字,得到的结果就会是只出现一次的2个数字的异或结果。 因为这两个数字不同,所以异或结果肯定不为0,且能够区分开这两个数字的地方就是异或结果中为1的位。假设异或结果中从右向左数第n位为1,那么我们就可以把原来数组中的数字按照第n位是否为1分为两部分,每一部分就会只包含一个只出现一次的数字,且其他的数字都是成对出现。接下来只要分别对这两个数组求异或,就能找出每部分只出现一次的数字。 阅读全文
posted @ 2014-05-19 15:11 月轩 阅读(2479) 评论(0) 推荐(0) 编辑
摘要: 二叉树中任意左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。 两种解法。 第一种:菜鸟的解法,出现重复遍历,时间复杂度高。 第二种:大神的解法,只遍历一次,高端大气上档次。 阅读全文
posted @ 2014-05-18 17:39 月轩 阅读(272) 评论(0) 推荐(0) 编辑
摘要: 多的不解释了,这里有两种解法。 第一种:一般的解法。 第二种:大神的解法,代码简洁高效。 阅读全文
posted @ 2014-05-18 17:26 月轩 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 统计一个数字在排序数组中出现的次数。例如输入{2,2,2,2,2,3,5,5}和数字2,输出5. 常规的顺序扫描法时间复杂度是O(n),可以进一步优化。用二分查找的方法进行查找可以把时间复杂度降为O(logn)。 阅读全文
posted @ 2014-05-17 19:16 月轩 阅读(262) 评论(0) 推荐(0) 编辑
摘要: 输入两个链表,找出他们的第一个公共结点。思想:我们可以先遍历一次得到分别得到两个链表的长度,然后计算得出长度差n,那么让较长的链表先走n步,然后两个链表一起向后走,直到两个指针指向同一个结点。这个结点就是我们要找的 结点。 阅读全文
posted @ 2014-05-15 22:21 月轩 阅读(376) 评论(0) 推荐(0) 编辑
摘要: 在数组中的两个数如果前面一个数大于后面的数字,则这俩个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 例如:数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)(7,5)(7,4)(6,4)(5,4)。 有两种方法: 第一种:顺序扫描法,时间复杂度是O(n2)。代码略。 第二种:运用归并排序的方法。思想是: 把数组递归的分成子数组,统计出相邻子数组的逆序对,统计过程中需对数组进行排序,防止重复统计。 阅读全文
posted @ 2014-05-15 18:04 月轩 阅读(341) 评论(0) 推荐(0) 编辑