ldjhust

工欲善其事 必先利其器

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  127 随笔 :: 0 文章 :: 21 评论 :: 90930 阅读

04 2013 档案

摘要:题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“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 阅读(187) 评论(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 阅读(299) 评论(0) 推荐(0) 编辑

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

摘要:二分搜索树的数据结构为:1 struct BinaryTreeNode2 {3 int nValue;4 5 BinaryTreeNode *pLeft;6 BinaryTreeNode *pRight;7 };首先我们来通过一个简单的例子来获取直接的感官,将这颗排序二叉树转变为排序的双向链表应为:可以很清楚的发现转换完成的双向链表的顺序其实就是二叉搜索树的中序遍历的顺序,因此这个题我们可以借助中序遍历来完成。因为二叉树的结构很符合递归的思想,因此基本上所有关于二叉树的问题都可以用递归来完成,这个问题也不例外。我们假设中序遍历到达根节点10时,它的左子树已经转换成了排序... 阅读全文
posted @ 2013-04-29 22:03 ldjhust 阅读(217) 评论(0) 推荐(0) 编辑

摘要:将引用参数设置为常量数据的引用有三个好处:使用const可以避免无意中修改数据的编程错误使用const使函数能够处理const和非const实参,否则将只能接受非const数据使用const引用使函数能够正确声称并使用临时变量因此,因尽可能将引用形参声明为const。 阅读全文
posted @ 2013-04-27 23:08 ldjhust 阅读(207) 评论(0) 推荐(0) 编辑

摘要:一个链表,节点里面的内容是字符串,如a->b->c->d->e,要求返回链表如下abcde->bcde->cde->de->e数据结构:1 struct NODE2 {3 char str[50];4 5 NODE *next;6 };首先直观的考虑可以用一个两层循环,时间复杂度O(n^2),当然这个效率是不被接受的 1 NODE *Linked(NODE *head) 2 { 3 assert (head != NULL); 4 5 for (NODE *p1 = head->next; p1 != NULL; p1 = p1->n 阅读全文
posted @ 2013-04-24 22:47 ldjhust 阅读(157) 评论(0) 推荐(0) 编辑

摘要:单向链表的反转分两种情况,一种是带头结点的单向链表的反转,另一种是不带头结点的单向链表的反转一、不带头结点的单向链表的反转 不带头结点的单向链表反转需要三个指针,一个指针存储当前节点,一个存储当前节点的前一个节点,最后一个指针存储当前节点的下一个指针,每次反转当前节点的指针指向,一次往后遍历链表。 1 NODE *ReverseWithouHead(NODE *&head) 2 { 3 assert (head != NULL); 4 5 // 不带头结点的单向链表的反转 6 7 if (NULL == (head->next)) 8 { 9 ... 阅读全文
posted @ 2013-04-24 16:15 ldjhust 阅读(311) 评论(0) 推荐(0) 编辑

摘要:strcpy函数的原型是char *strcpy(char *strDest, const char *strSrc);不调用任何库函数实现strcpy的功能 1 // realize strcpy function without any library functions 2 #include <stdio.h> 3 #include <assert.h> 4 5 char *strcpy1(char *strDest, const char *strSrc) 6 { 7 assert (strDest != NULL); 8 9 assert (strSrc != 阅读全文
posted @ 2013-04-21 10:05 ldjhust 阅读(967) 评论(0) 推荐(0) 编辑

摘要:参数入栈顺序是从右往左依次压入栈,因此在输出的时候需要谨慎处理 阅读全文
posted @ 2013-04-20 22:18 ldjhust 阅读(247) 评论(3) 推荐(0) 编辑

摘要:const int count = 3;…int *p = (int*)&count;*p = 5;cout << count << “ ” << *p << endl;…程序并不会报出编译错误,而且会打印出3 5,原因是count在预编译期间就会被替换成3,至于为什么可以修改常量的值,那是因为const *被强制转换成为了int *。 阅读全文
posted @ 2013-04-20 21:34 ldjhust 阅读(110) 评论(0) 推荐(0) 编辑

摘要:1 #include <stdio.h> 2 #include <assert.h> 3 #include <malloc.h> 4 5 typedef struct NODE 6 { 7 int data; 8 9 struct NODE *next; 10 }Linklist; 11 12 void Reverse(Linklist *head) 13 { 14 assert (NULL != head); 15 16 Linklist *p1 = NULL; 17 Linklist *p2 = NULL; 18 19 ... 阅读全文
posted @ 2013-04-11 10:19 ldjhust 阅读(247) 评论(0) 推荐(0) 编辑

摘要:计算一个整数的二进制表示中1的个数: 1 #include "stdafx.h" 2 3 int NumberOfOne(int a) 4 { 5 int nCount = 0; 6 7 while (0 != a) 8 { 9 ++nCount;10 11 a &= a - 1;12 }13 14 return (nCount);15 }16 17 int NumberOfOne1(int a)18 {19 int nCount = 0;20 21 for (int i = 0; i < 32; ++... 阅读全文
posted @ 2013-04-09 14:34 ldjhust 阅读(165) 评论(0) 推荐(0) 编辑

摘要:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字。(原数组不必保留)分析:因为数组中的每一个元素的范围已经确定,我们可以通过将各个元素交换到下标与其相等的位置上去看会不会发生冲突来判断是否存在重复的数字。 1 #include "stdafx.h" 2 #include <assert.h> 3 4 void SwapValue (int *NumA, int *NumB) 5 { 6 assert (NULL != NumA); 7 8 assert (NULL != NumB); 9 10 if ((*NumA) != ( 阅读全文
posted @ 2013-04-07 10:44 ldjhust 阅读(802) 评论(0) 推荐(0) 编辑

摘要:转载自新书《程序员面试笔试宝典》官网参考《程序员面试笔试宝典》实现用位操作进行四则运算:需要熟练掌握一些常见功能的位操作实现,具体为: <1> 常用的等式:-n = ~(n-1) = ~n+1 <2> 获取整数n的二进制中最后一个1:n&(-n) 或者 n&~(n-1),如:n=010100,则-n=101100,n&(-n)=000100 <3> 去掉整数n的二进制中最后一个1:n&(n-1),如:n=010100,n-1=010011,n&(n-1)=010000(1)、加法实现a + b,我们可以用 “异或” 运 阅读全文
posted @ 2013-04-04 11:07 ldjhust 阅读(264) 评论(0) 推荐(0) 编辑

摘要:用位操作实现求两个数a和b的平均值,只需将两个数的相同位提取出来,再将不同的位加在一起除2(即右移一位),用表达式说明即为:((a & b) + (a ^ b) >> 1),用这样的方式计算两个数的平均值可以防止数据溢出。但是请记住用这个表达式算出的结果永远是不超过真实平均值的最大整数,即若真实结果是-5.5,则此表达式给出的结果是-6,若真实平均值是-5,则表达式的结果是-5。 现在解释一下这个表达式的原理,求两个数的平均值我们把这两个操作数分成二进制位相同的部分和二进制位不同的部分,例如a=5(0101),b=6(0110),他们相同的部分为a0=0100,b0=010 阅读全文
posted @ 2013-04-02 14:35 ldjhust 阅读(464) 评论(0) 推荐(0) 编辑

摘要:知道二叉树的前序和中序序列重建这颗二叉树,从最简单的开始,我们假设这两个序列的确是一颗二叉树的前序和中序序列并且这可二叉树中没有重复的节点: 1 #include <stdio.h> 2 #include <malloc.h> 3 4 struct NODE 5 { 6 int data; 7 8 struct NODE *lChild; 9 struct NODE *rChild; 10 }; 11 12 // 重建二叉树,要求此二叉树中不能有重复的节点 13 void RebuildBinaryTree(int *PreOrder, i... 阅读全文
posted @ 2013-04-01 21:19 ldjhust 阅读(211) 评论(0) 推荐(0) 编辑

摘要:二叉树的节点结构为:1 struct NODE2 {3 char ch;4 5 struct NODE *lChild;6 struct NODE *rChild;7 }; 按照前序的顺序递归建立一颗二叉树: 1 void PreOrderCreatBinary(struct NODE **root) 2 { 3 // 函数入口检验 4 if (NULL == root) 5 { 6 printf ("Invalid Parameter(s)!\n"); 7 return; 8 } 9 10 ... 阅读全文
posted @ 2013-04-01 19:42 ldjhust 阅读(334) 评论(0) 推荐(0) 编辑

摘要:定义两个变量nSum、nMaxSum,其中nSum用来存储当前和,nMaxSum用来存储最大和,若nSum <= 0,则需从下一个数开始重新记录当前和,每计算一次当前和,需与nMaxSum比较,若nSum > nMaxSum则需更新nMaxSum,反之不需更新。基于上述分析,写出代码如下: 1 int SubArrayMaxSum(int *arr, int N) 2 { 3 assert (arr != NULL); 4 5 assert (N > 0); 6 7 int nSum = 0; 8 9 // 将int型的最小值INT_MIN赋给nMaxSu... 阅读全文
posted @ 2013-04-01 15:22 ldjhust 阅读(176) 评论(0) 推荐(0) 编辑

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