代码改变世界

Programe_Of_Beauty:2.1 求二进制数中1的个数(一点我的想法)

2011-06-06 01:57 by x_feng, 235 阅读, 1 推荐, 收藏,
摘要:对于一个字节(8bit)的无符号整型变量,求其二进制表示中的1的个数。先看看书上给出的解法:解法一:以二进制0000 1010为例,其值为10。10除以2 = 5,其二进制为0000 0101,5除以2 = 2,其二进制为0000 0010.我们发现每除2,二进制向右移了一位。当二进制的最后一位为0时,是偶数,当二进制最后一位为1时是奇数。这样我们就可以不停除2,每一个1都会移到最后的时候。2除不尽说明最后位为1.int count(BYTE v){ int num = 0; while(v) { if (v%2 == 1)//最后一位是1 { num++ ;} v = v/2; }}解法二: 阅读全文

C++STL:Map剖析

2011-06-05 22:00 by x_feng, 796 阅读, 0 推荐, 收藏,
摘要:map是(键-值)对的集合,也是通常所说的关联数组。可以使用键作为下标来获取一个值,关联的本质在于元素的值与某个特定的键相关联,而并非下标。1,map简介map是一类关联容器。它的特点是:增加和删除节点对迭代器影响很小,除了那个操作节点,对其它的节点都没什么影响。对于map来说,不可以修改键,但可以修改键对应值的值。map的底层结构是:平衡二叉搜索树,也就是RB-tree(红黑树)。功能:建立key-value的对应。key和value可以是任意类型。根据key值快速查找记录,时间复杂度为log(N)。快速插入key-value记录。快速删除记录。根据key修改value记录。遍历。2,map 阅读全文

迅雷100题:数组

2011-06-04 19:44 by x_feng, 284 阅读, 0 推荐, 收藏,
摘要:解析:char* a[];是一个指针数组,a是数组名,a中的元素是3个char*类型的指针。那么我们看看a+1,指的是什么?既然a是数组,那么a+1就是指向a[1]的位置。那么可知:char**pa = a;p++当然指向的是a[1]的位置了。由于a[1]是一个char*型的指针,指向的是字符串”the”,因此*a[1]也就是*pa输出的是the。 解析:答案是B。很easy不解释了。 解析:答案是D,还可以通过指针传递。http://kb.cnblogs.com/page/78986/ 解析:答案是D。p1仅仅是一个指针,没有更多的空间存储p2的元素。.strcat原型:extern ch. 阅读全文

C++数组剖析

2011-06-03 14:42 by x_feng, 315 阅读, 1 推荐, 收藏,
摘要:(发现自己像记流水账一样,感觉条例不太清晰,也没有大牛的深入,或许这就是想写博的原因,发现不足和差距,在学习中延伸更多的东西)C++Primer曰:与vector类型相似,数组也可以保持某种类型的一组对象,它们的区别在于:数组长度固定。数组一经创建,就不允许增加新的元素。C++Primer曰:现代C++程序应尽量使用vector。设计良好的程序只有在强调速度时才在类的内部使用数组。C++Primer曰:与vector相比,数组的缺陷在于:数组长度固定,程序员无法知道一个给定数组的长度,无size操作,无push_back动态添加元素。C++Primer曰:与使用vector类型的程序相比,依赖 阅读全文

从一道笔试题中看转义字符

2011-06-01 14:22 by x_feng, 830 阅读, 0 推荐, 收藏,
摘要:题目如下:char s[] = “\\123456\123456\t”;printf(“%d\n”, strlen(s));A 12 B 13 C 16 D 以上都不对先不说结果如何,我们看看s[]在内存中的结构: 很清楚,char[13]数组大小为13,答案似乎是B,很不幸错了,strlen返回的长度不包括结尾空白符,答案为A 12。‘\’为转义符,转义字符用反斜杠\后面跟一个字符或一个八进制或十六进制数表示。下图为转义字符表: char s[] = “\\123456\123456\t”;中的\\相对于一个字符\,\123中,1,2,3都满足8进制数,因此\123其实表示一个字符。那么我现 阅读全文

Programe_Of_Beauty:2.10 寻找数组中的最大值和最小值

2011-05-31 21:43 by x_feng, 225 阅读, 0 推荐, 收藏,
摘要:1.问题定义对于一个由N个整数组成的数组,需要比较多少次才能把最大和最小的数找出来呢?2.编程之美解法解法一,遍历数组一次,分别比较,最大最小值,比较次数为2*N。解法二,遍历数组,每两个进行比较,小的放前面,大的放后面,如a[0]和a[1]比较,如果a[1]大,则交换,比较N/2次。这样,最大数在偶数位上,最小数在奇数位上,然后再各比较N/2次,共比较1.5N次。但是该方法改变了原有的数组结构,数据有变动。解法三,设置两个变量Max,Min。遍历数组,每两个数据进行比较,大的再跟Max比较,小的跟Min比较,共1.5N次。似乎是最少的比较次数了。具体实现如下:void FindArrayMa 阅读全文

C++ enum剖析

2011-05-31 19:55 by x_feng, 704 阅读, 0 推荐, 收藏,
摘要:枚举的定义要用到关键字enum,就像类的定义用class,结构体用struct一样,enum和struct、class都是用户自定义类型,只不过枚举的内容比较简单,也不常用。如下:class myClass//类名{}mc;//类对象struct myStruct//结构体名{}ms;//结构体对象enum myEnum//枚举名{ //标识符 = 整型常数}me;//枚举对象。可以没有枚举名和枚举变量1.枚举定义enum open {in, out, app}openfile;默认第一个枚举成员赋值为0,即in = 0,后面的每个枚举成员赋的值比前面的大1。也可以显式赋值,如:enum op 阅读全文

Programe_Of_Beauty:3.10 分层遍历二叉树(另一种实现方法)

2011-05-30 19:41 by x_feng, 300 阅读, 0 推荐, 收藏,
摘要:1.问题定义给定一棵二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层将单独输出一行),每一层要求访问的顺序为从左到右,并将节点依次编号。下面是一个例子: 正确输出为:12 34 5 67 8节点定义:struct Node { Node *pLeft; //节点数据 Node *pRight; //左指针 int data; //右指针};2.编程之美解法书上举出两个解法。第一个解法是用递归方式,搜寻并打印某一层的节点,再打印下一层的节点。这方法简单但时间效率不高(但不需要额外空间),因此书中亦提供了第二个解法。 书中第二个解法,使用vector容器来储存n个节点信息,并用 阅读全文

Programe_Of_Beauty :3.9 重建二叉树

2011-05-29 15:30 by x_feng, 225 阅读, 0 推荐, 收藏,
摘要:1.问题定义对于二叉树的3中遍历方法,相信大家耳熟能详。那么如果我们知道了其中的两种遍历结果,能不能把一棵二叉树重新建立起来?给定一棵二叉树,假设每个节点都用唯一的字符来表示,没有重复。结构如下:struct _Node{ _Node* Lchild; _Node* Rchild; char data;};假设已有了前序遍历和中序遍历的结果,希望通过一个算法来重建这棵树。前序遍历:a, b, d, c, e, f 显然a是根节点中序遍历:d, b, a, e, c, f a前面的d, b是a的左子树中的节点,a后面的e, c, f是a右子树中的节点重建后的图如下: 2.分析与解法不难发现a是前 阅读全文

Programe_Of_Beauty:3.8 求二叉树中节点的最大距离

2011-05-28 19:15 by x_feng, 257 阅读, 1 推荐, 收藏,
摘要:1.问题定义定义距离为两个节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。下面是两个例子: 上图中列出了二叉树中节点间距离最大的所有可能情况。箭头所指的边标示了A、B之间最大的距离。2.问题分析从上图中可以看出,距离最远的两个点一定有一个共同的“根”节点,或者其中一个就是根节点(注意前者的“根”与后者的根的区别,前者的“根”包含后者)。因此只要能计算出所有“根”的左子树的最深长度和右子树的最深长度,就可以知道经过此“根”节点的所有路径中的最大距离。通俗的讲,就是计算任意一个节点的左右子树的最深长度。3.递归算法树节点的结构体定义:struct _Node{ _Node 阅读全文