ldjhust

工欲善其事 必先利其器

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
上一页 1 ··· 8 9 10 11 12 13 下一页

2013年4月7日

摘要: 给定一个长度为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 阅读(800) 评论(0) 推荐(0) 编辑

2013年4月4日

摘要: 转载自新书《程序员面试笔试宝典》官网参考《程序员面试笔试宝典》实现用位操作进行四则运算:需要熟练掌握一些常见功能的位操作实现,具体为: <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 阅读(259) 评论(0) 推荐(0) 编辑

2013年4月2日

摘要: 用位操作实现求两个数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 阅读(460) 评论(0) 推荐(0) 编辑

2013年4月1日

摘要: 知道二叉树的前序和中序序列重建这颗二叉树,从最简单的开始,我们假设这两个序列的确是一颗二叉树的前序和中序序列并且这可二叉树中没有重复的节点: 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 阅读(207) 评论(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 阅读(330) 评论(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) 编辑

2013年3月30日

摘要: 二进制乘法实际上就是左移和加法,假设被乘数是a,我们将乘数分解为2^n + 2^m + 2^k ...,则乘法结果为:a<<n + a<<m+a<<k ... ,以下题为例:4. What is the result of binary number 01011001 after multiplying by 0111001 and adding 1101110?(A) 0001 0100 0011 1111(B) 0101 0111 0111 0011(C) 0011 0100 0011 0101其乘法过程就是: 01011001<<5 + 0 阅读全文
posted @ 2013-03-30 23:39 ldjhust 阅读(1096) 评论(0) 推荐(0) 编辑

2013年3月29日

摘要: 转载自http://blog.csdn.net/jtlyuan/article/details/7440591卡特兰数:规定C0=1,而C1=1,C2=2,C3=5,C4=14,C5=42,C6=132,C7=429,C8=1430,C9=4862,C10=16796,C11=58786,C12=208012,C13=742900,C14=2674440,C15=9694845··················&# 阅读全文
posted @ 2013-03-29 13:53 ldjhust 阅读(227) 评论(1) 推荐(1) 编辑

摘要: 1、下面两段代码中for循环分别执行了多少次?unsignedshorti,j;for(i=0, j=2; i!=j; i+=5, j+=7){}unsignedshorti,j;for(i=3,j=7;i!=j;i+=3,j+=7) 对于这类问题可以利用相对运动的思想: 根据数据类型可以知道环形轨道的长度是65536,对于第一个for循环假设i原地不动,则j在局里起点为2的位置以步长2向前运动,则j需要走(65536 - 2) / 2 = 32767步才能回到起点与i重合,此时循环退出,因此第一个for循环执行了32767次。 对于第二个for循环轨道的长度依然是65536,我们以i的... 阅读全文
posted @ 2013-03-29 10:00 ldjhust 阅读(195) 评论(2) 推荐(0) 编辑

2013年3月28日

摘要: 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。通常堆是通过一维数组来实现的。在起始数组为 0 的情形中: 父节点i的左子节点在位置 (2*i+1); 父节点i的右子节点在位置 (2*i+2); 子节点i的父节点在位置 floor((i-1)/2);在堆的数据结构中,堆中的最大值总是位于根节点。堆中定义以下几种操作: 最大堆调整(Max_Heapify):将堆的末端子结点作调整,使得子结点永远小于父结点 创建最大堆(Build_... 阅读全文
posted @ 2013-03-28 12:53 ldjhust 阅读(399) 评论(0) 推荐(0) 编辑

上一页 1 ··· 8 9 10 11 12 13 下一页