2012年8月17日

编程之美:编程判断两个链表是否相交

摘要: 1.问题描述给出两个单向链表的头指针,比如h1、h2,判断两个链表是否相交。编程之美为了简化问题,假设两个链表均不带环。如下图:2.分析与解法解法一:直观法,先判断第一个链表的每个节点是否在第二个链表中,这种方法时间复杂度为O(Length(h1)*Length(h2))解法二:hash表计数法,首先将第一个链表的所有节点地址进行hash排序,建立hash表,然后针对第二个链表的每个节点的地址,查询hash表,如果它在hash表中存在,那么说明两个链表有交点。这个方法时间复杂度O(Length(h1)+Length(h2)),空间复杂度O(Length(h1))。解法三:转换为是否有环问题,可 阅读全文

posted @ 2012-08-17 14:54 as_ 阅读(2820) 评论(0) 推荐(0) 编辑

编程之美:求数组的子数组之和的最大值

摘要: 1.问题描述一个有N个整数元素的一维数组( A[0], A[1], ... , A[n-2], A[n-1]),子数组之和的最大值是什么?(要求子数组的元素是连续的)例子:有数组( -2, 5, 3, -6, 4, -8, 6),则其子数组之和的最大值为8,其对应的数组为(5,3)2.分析与解法解法一:采用直接法,记Sum[i...j],为数组A中从第i到第j之间所有数之和,算出所有Sum,取其最大,代码如下,时间复杂度O(N2):int maxSum1(int *A, int n){ int max = -1; int i, j, sum; for(i = 0; i... 阅读全文

posted @ 2012-08-17 13:28 as_ 阅读(4757) 评论(3) 推荐(0) 编辑

编程之美:阶乘数计算

摘要: 1.问题描述1).给定一个整数N,那么N的阶乘N!末尾有多少个0?例如:N=0,N!=3628800,N!的末尾有两个0.2).求N!的二进制表示中最低1的位置2.分析与解法首先考虑,如果N! = K*10M,且K不能被10整除,那么N!末尾有M个0.再考虑对N!质因分解,N! = (2X)*(3Y)*(5Z)...,由于10=2*5,所以M只跟X和Z有关,每一对2和5都可以得到一个10,于是M=min(X,Z)。不难看出X大于等于Z,因为在N!分解的数种明显2出现的频率要高于5,所以把公式简化为M=Z。根据上面的分析,有对于问题1解法一:要计算Z,最直接的方法,就是计算i(i =1, 2, 阅读全文

posted @ 2012-08-17 09:58 as_ 阅读(659) 评论(0) 推荐(0) 编辑

导航