随笔分类 -  剑指offer

摘要:题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点依然是按照递增排序的。链表结点定义如下:1 struct ListNode2 {3 int m_nValue;4 ListNode* m_pNext;5 };思路:利用递归。每一次把具有较小值的结点赋给MergeHead,MergeHead->m_pNext是合并剩下链表所返回的头结点。 1 ListNode* MergeSortedList(ListNode *pHead1, ListNode *pHead2) 2 { 3 if (pHead1 == NULL) 4 { 5 retu... 阅读全文
posted @ 2013-05-14 16:48 hust_枫 阅读(277) 评论(1) 推荐(0) 编辑
摘要:题目:求1+2+……+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字及条件判断语句(A?B:C)思路:已知1+2+……+n = n(n+1)/2,但是题目条件限制,故公式不能用。求和无外乎循环和递归,但是一般的循环需要用for或while,递归需要用判断语句if,因此要改变思路去思考。基于循环的做法:利用构造函数。设置类中的静态变量N 和sum,每次实例化对象调用构造函数时把N自增并加到sum上。求1~n的和就是要实例化n个对象。 1 class Temp 2 { 3 public: 4 Temp() 5 { 6 +... 阅读全文
posted @ 2013-05-06 22:50 hust_枫 阅读(250) 评论(0) 推荐(0) 编辑
摘要:前面已经实现了两个栈实现队列的功能(http://www.cnblogs.com/ivorfeng/archive/2013/05/01/3053206.html),今天就实现利用两个队列实现栈的push和pop功能。思路:已有queue1和queue2;进栈:初始时,两个队列均为空,元素压入queue1;之后需要判断压入非空的队列中;出栈:出栈时,两个队列必有一个为空,另一个非空,因此需要把非空的队列只留下最后一个元素,其他均转移到另一个队列中;再把之前剩下的一个元素输出。ps:出栈的时候,一开始想着统一代码,想把已经转移到另一个队列的元素再转回来,这样就可以保持每次只对其中一个队列(que 阅读全文
posted @ 2013-05-03 20:49 hust_枫 阅读(234) 评论(0) 推荐(0) 编辑
摘要:题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted);前提:默认输入的待删除节点在链表中!链表结点结构定义如下:1 struct ListNode2 {3 int m_nValue;4 ListNode* m_pNext;5 };思路:若待删结点的下一结点非空,则把它的值复制给待删节点,然后释放待删结点的下一结点; 若待删结点的下一结点为空且等于待删结点等于头结点,则释放之; 若上面两种情况都不是,即为尾结点,需要从头遍历而... 阅读全文
posted @ 2013-05-03 19:44 hust_枫 阅读(286) 评论(0) 推荐(0) 编辑
摘要:题目:写一个函数,输入一个链表的头结点,反转该链表并返回反转后链表的头结点。链表结点定义如下: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_枫 阅读(372) 评论(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_枫 阅读(216) 评论(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_枫 阅读(329) 评论(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_枫 阅读(325) 评论(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_枫 阅读(209) 评论(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_枫 阅读(1041) 评论(0) 推荐(1) 编辑

点击右上角即可分享
微信分享提示