ldjhust

工欲善其事 必先利其器

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

2013年4月30日

摘要: 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。思路:先反转整个字符串,再分别反转每一个单词。反转字符串代码: 1 void ReverseString(char *Str) 2 { 3 assert (Str != NULL); 4 5 int nLength = strlen (Str); 6 7 // 首先反转整个字符串 8 ReverseWord (Str, nLength); 9... 阅读全文
posted @ 2013-04-30 21:48 ldjhust 阅读(183) 评论(0) 推荐(0) 编辑

摘要: 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如:输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10 / \ / \ 5 7 9 11因此返回true。但是如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。思路:由后序遍历的特点可知数组的最后一个元素是根节点,若它是某一颗二分查找树的后序便利的结果,那么前面的部分可以连续的分成来那个部分,左边部分是这个根节点的左子树,特点是都小于或等于这个根节点,右边部分是这个根节点的... 阅读全文
posted @ 2013-04-30 20:46 ldjhust 阅读(296) 评论(0) 推荐(0) 编辑

摘要: 给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。为了简化问题,我们假设俩个链表均不带环。思路:首先即使带环也没关系,我们只需将环断开就又转换成了判断两个不带环的单向链表是否相交的问题,因此我们归根结底只需给出判断两个不带环的单向链表是否相交的算法即可。 因为单向链表的节点只有一个指向下一个节点的指针,因此如果两个单向链表相交,那么他们一定一定是成‘Y’型,即他们的最后一个节点一定一样的,则这样个问题就转换成判断两个单向链表的最后一个节点是否相等的问题,分析到这里,接下来写代码就是轻轻松松: 注意,这里我们使用的链表是有头节点的,如果题目要求是无头节点的链表,那么代码还需做.. 阅读全文
posted @ 2013-04-30 17:12 ldjhust 阅读(305) 评论(0) 推荐(0) 编辑

摘要: 输入n 个整数,输出其中最小的k 个。例如输入1,2,3,4,5,6,7 和8 这8 个数字,则最小的4 个数字为1,2,3 和4。经典的TopK问题,因为需要最小的K个元素,所以只需创建并维持一个拥有K个元素的最大堆即可。创建一个拥有K个元素的最大堆的代码为: 1 void CreateMaxHeap(int *MaxHeap, int K) 2 { 3 assert (MaxHeap != NULL); 4 5 assert (K > 0); 6 7 // 从最后一个有子孩子的节点开始往下调整,一直到根节点,则这个最大堆就创建好了 8 for (int ... 阅读全文
posted @ 2013-04-30 15:42 ldjhust 阅读(432) 评论(0) 推荐(1) 编辑

摘要: 对于这个问题我们可以利用前序遍历搜索二叉树的每一条路径,并利用栈保存找到的路径,然后判断此路径是否符合要求,若符合要求则输出此路径,否则继续寻找下一条路径。即利用回溯和递归的思想。 基于上述分析,可写出如下获取并判断路径的方法: 1 void GetRoad(BinaryTreeNode *root, int *Stack, int nTop, int nSum, int nValue) 2 { 3 assert (root != NULL); 4 5 assert (Stack != NULL); 6 7 assert (nTop >= -1); 8 9 ... 阅读全文
posted @ 2013-04-30 14:36 ldjhust 阅读(300) 评论(0) 推荐(0) 编辑

摘要: 定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。要求函数min、push 以及pop 的时间复杂度都是O(1)。我们定义数据结构如下:1 struct StackElement2 {3 // 存储入栈元素4 int nData;5 6 // 存储栈中最小元素7 int Min;8 };节点中有两个属性,一个存储此节点中的内容,一个存储当前栈中的最小元素。则push函数代码为: 1 void Push(StackElement *Stack, int nTop, int nValue) 2 { 3 assert (Stack != NUL... 阅读全文
posted @ 2013-04-30 12:33 ldjhust 阅读(156) 评论(0) 推荐(0) 编辑

摘要: 二叉树的数据结构如下:1 struct BinaryTreeNode2 {3 int nData;4 5 BinaryTreeNode *pLeft;6 BinaryTreeNode *pRight;7 };想要获取二叉树的深度只需先分别取得其左右子树深度的最大值再加1即为这颗二叉树的深度,而求其左右子树的深度也可以这样做,因而可以很快写出递归代码: 1 int GetDeepth(BinaryTreeNode *root) 2 { 3 if (NULL == root) 4 { 5 // 空二叉树深度为0 6 retur... 阅读全文
posted @ 2013-04-30 10:00 ldjhust 阅读(212) 评论(1) 推荐(0) 编辑