摘要: 题目:写一个函数,输入一个链表的头结点,反转该链表并返回反转后链表的头结点。链表结点定义如下:1 struct ListNode2 {3 int nKey;4 ListNode *pNext;5 };思路: 需要三个指针pPre, pCur, pNext,分别前一结点,当前结点以及下一结点,为了防止在反转链表过程中发生链表断裂,需要记录当前结点的下一结点。每一步操作为: 1.记录pNext = pCur->pNext; 2. pCur的pNext指向pPre; 3. pPre指向pCur,pCur指向pNext。此题最容易错误的是发生链表断裂!code: 1 //反转链表 2... 阅读全文
posted @ 2013-05-02 21:21 hust_枫 阅读(368) 评论(2) 推荐(0) 编辑
摘要: 题目:输入一个链表的头节点,从尾到头打印出每一个节点的值。(要求不改变链表的结构)链表节点定义如下:1 struct ListNode2 {3 int nKey;4 ListNode *pNext;5 }思路一:由从尾到头容易想到栈的后进先出的性质,于是可以用栈实现。(如果可以改变链表的结构,则可以先把链表反转,再从头依次输出结果)反转链表可参考:http://www.cnblogs.com/ivorfeng/archive/2013/05/02/3055471.htmlcode: 1 //利用栈实现 2 void PrintListInStack(ListNode *pHea... 阅读全文
posted @ 2013-05-02 20:31 hust_枫 阅读(213) 评论(0) 推荐(0) 编辑
摘要: Question: Write code to remove duplicates from an unsorted linked list.( from Cracking the coding interview)链表使用以下结构1 struct LinkListNode2 {3 int key;4 LinkListNode *next;5 };解法一:使用hash,即要求缓冲区。遍历链表,若不含该节点值,则加入hash表,否则跳过该节点。C++好像没有直接的hashtable~~实现有待学习!解法二:不使用buffer,使用两个指针,分别指向当前节点pCur和其前一节点pP... 阅读全文
posted @ 2013-05-01 20:25 hust_枫 阅读(925) 评论(0) 推荐(0) 编辑
摘要: 题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入元素和在队列头部删除节点的功能。 1 template <typename T>class CQueue 2 { 3 public: 4 CQueue(void); 5 ~CQueue(void); 6 7 void appendTail(const T& element); 8 T deleteHead(); 9 10 private:11 stack<T> stack1;12 stack<T> stack2;13 ... 阅读全文
posted @ 2013-05-01 15:08 hust_枫 阅读(327) 评论(0) 推荐(1) 编辑
摘要: 题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。在原来的字符串上替换,并保证输入的字符串后面有足够的空余内存。思路:解法一:最容易想到的就是当遇到空格时,将后面的字符向后面移动2位。此方法的时间复杂度为O(N^2)。解法二: 首先遍历字符串,统计字符串中的空格数目,计算新的字符长度 newLen = oldLen + 2 * 空格数; 依次从字符串后面开始复制,分别用p1,p2指向旧新字符串的末尾,当遇到空格时,依次赋值‘0’,‘2’,‘%’;当p1 == p2时,过程终止(p1,p2之前的都.. 阅读全文
posted @ 2013-04-30 19:00 hust_枫 阅读(320) 评论(0) 推荐(0) 编辑
摘要: 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。例如,数组为1 2 8 92 4 9 124 7 10 136 8 11 15如果在数组中查找数字9,则返回true;如果查找数字20,则返回false。思路:元素是分别按行按列递增,但是每一行(列)的元素不一定都比前一行(列)元素大。因此,我们要利用元素的排列特点,按照一定的规律去寻找元素。由于已经知道每一列是从上到下递增排序,我们先选左下角的第一个元素,即第一列的最大值,作为起始元素(记为p=a[row][col])比较 阅读全文
posted @ 2013-04-30 17:16 hust_枫 阅读(208) 评论(0) 推荐(0) 编辑
摘要: 题目:现有N个区间[a1,b1],...,[aN,bN],若区间有重叠则合并,要求输出最终的区间结果。(合并后有多个区间则输出多个区间)sample:现有区间[4, 9], [8, 10], [15, 20], [1, 16], 合并后的区间为[1, 20]。解题思路:定义数据结构:1 struct myDataType2 {3 unsigned int a;4 unsigned int b;5 bool flag;6 };接着按区间左端点将区间排序,再从前往后依次判断相邻两区间(假设分别为区间p1,p2)是否有重叠(Overlap),若有重叠,则更新后一个区间(p2)... 阅读全文
posted @ 2013-04-30 16:18 hust_枫 阅读(1039) 评论(0) 推荐(1) 编辑
摘要: 单精度浮点数: 1位符号位 8位阶码位 23位尾数双精度浮点数: 1位符号位 8位阶码位 52位尾数实数在内存中以规范化的浮点数存放,包括数符、阶码、尾数。数的精度取决于尾数的位数。比如32位机上float型为23位 double型为52位。单精度float型存储在内存中的大小为4个字节,即32位。浮点表示的一般形式为:R=M*2^e (R:Real M:Mantissa尾数 e:exponent阶码)把上面float的二进制可分成三部分: x xxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx数符(1b) 阶码(8b) 尾数(23b)double型的浮点数分别是:数符(1b)、 阅读全文
posted @ 2013-04-04 12:10 hust_枫 阅读(454) 评论(0) 推荐(0) 编辑
摘要: C++类静态成员与类静态成员函数当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关。静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关。静态数据成员的用途之一是统计有多少个对象实际存在。静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的。也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建一个类的对象则静态数据成员都要被重新初始化。静态成员不可在类体内进行赋值, 阅读全文
posted @ 2013-04-01 09:23 hust_枫 阅读(264) 评论(0) 推荐(0) 编辑
摘要: 最长递增子序列Longest Increasing Subsequence (LIS)指一个序列中所包含的最长的递增子序列。例如, 序列{2, 1, 4, 2, 3, 7, 4, 6}的LIS是{1, 2, 3, 4, 6},其长度为5。写一函数计算一个序列中的最长子序列长度。一般思路:使用动态规划,数组记为a[],用f[i]表示从第0个元素到第i个元素的LIS长度(初始化为1,因为a[i]本身长度为1),对于每一个i,需要和i以前的元素进行比较,并更新f[i]的值,即比较a[i]和a[j],0 <= j < i。状态转移方程为f[i] = max{f[i], f[j]+1, if 阅读全文
posted @ 2013-03-29 13:47 hust_枫 阅读(257) 评论(0) 推荐(0) 编辑