![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
编程之美
文章平均质量分 70
烟蓑雨笠
这个作者很懒,什么都没留下…
展开
-
寻找发帖“水王”
寻找发帖“水王” 提出问题: 发帖“水王”指的是发帖数目超过了总帖数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个发帖“水王”吗? 解法一: 大家最直接能想到的方法是:对所有的ID排序。然后再扫描一遍排好的ID列表,统计各个ID出现的次数。如果某个ID出现的次数超过总数的一半,那么就输出这个ID。 解法二: 对ID原创 2014-03-29 21:36:54 · 1045 阅读 · 0 评论 -
计算字符串的相似度
计算字符串的相似度 提出问题 许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程度。我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把“a”替换为“b”)。 2.增加一个字符(如把“abdd”变为“aebdd”)。 3.删除一个字符(如把“travelling”变为“traveling”)。 比如,对于“abcdef原创 2014-05-23 21:28:28 · 959 阅读 · 0 评论 -
数组循环移位
数组循环移位 提出问题: 设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。 解法一: 我们先试验简单的方法,可以每次将数组中的元素右移一位,循环K次。虽然这个算法可以实现数组的循环右移,但是时间复杂度为O(N*K)。大家开始可能会有这样的潜在假设,KN,右移K-N之后的数组序列跟右移K位的结果是一样的。进而可以得出一条通用的规原创 2014-04-12 18:02:55 · 1219 阅读 · 0 评论 -
快速寻找满足条件的两个数
快速寻找满足条件的两个数 提出问题: 能否快速找出一个数组中的两个数字,让这两个数字的和等于一个给定的值,为了简化起见我们假设这个数组中至少存在一组满足要求的解。 例如有如下两个数组, 5,6,1,4,7,9,8 给定sum=10 1,5,6,7,8,9给定sum=10 解法一: 这个题目也不是很难,也很容易理解。但是要得出高效的解法,还是需要一番思考的。原创 2014-04-09 20:23:07 · 948 阅读 · 0 评论 -
二维子数组之和的最大值
二维子数组之和的最大值 我们在前面分析了一维数组的子数组之和最大值的问题(详情请见博客:子数组之和的最大值),以及它的一些扩展问题(详情请见博客:最大子数组和的扩展问题),那么如果是二维数组又该如何求呢??? 解法一: 最直接的方法当然是直接枚举每一个矩形区域,然后再求这个矩形区域中元素的和。 #include #include #define MAX 1005 #define INF 0原创 2014-05-04 21:03:19 · 1294 阅读 · 0 评论 -
最大公约数问题
最大公约数问题 提出问题: 写一个程序,求两个数的最大公约数(Greatest Common Divisor,GCD)。如果两个正整数都很大,有什么简单的算法吗? 例如,给定两个数1100 100 210 001,120 200 021,求出其最大公约数。 解法一: 求最大公约数是一个很基本的问题。早在公元前300年左右,欧几里得就给出了高效的解法—辗转相除法。 例如:F(原创 2014-04-02 19:00:14 · 1235 阅读 · 0 评论 -
1的数目
1的数目 提出问题: 给定一个十进制数N,写下从1到N的所有整数,然后数一下其中出现的所有1的个数。例如: N=12,那么1,2,3,4,5,6,7,8,9,10,11,12。这样1的个数为5。 问题是:写出一个函数F(N),返回1到N之间出现1的个数,比如F(12)=5。 解法一: 这个问题看上去并不困难,最简单的方法就是从1开始遍历到N,将其中每一个数中含有1的个数加起原创 2014-04-01 23:14:30 · 1120 阅读 · 0 评论 -
求数组的子数组之和的最大值
求数组的子数组之和的最大值 提出问题: 一个有N个整数元素的一维数组(A[0],A[1],A[2]……A[n-1]),那么子数组之和的最大值是什么? 例如:-2 5 3 -6 4 -8 6 maxsum=8 解法一: 我们先明确题意, 1:题目说的子数组是连续的 2:题目只需要求和,并不需要返回子数组的具体位置 3:数组的元素是整数,所以数组可能包括正整数,零,负整数。原创 2014-04-15 23:16:30 · 979 阅读 · 0 评论 -
不要被阶层吓倒
不要被阶层吓到 提出两个问题: 1,给定一个正整数N,那么N的阶层末尾有多少个0呢? 2,求N的阶层的二进制表示中最低位1的位置。 有人拿到这样的题目会想:是不是要计算出N!的值呢?如果溢出了怎么办? 实际上有必要计算出N!吗? 事实上,没有必要。换个角度想,如果考虑哪些数相乘得到10,问题是不是就变得简单了? 对N进行质因数分解,N!=(2^x)*(3^y)*(5*z)*.原创 2014-03-20 21:32:00 · 1149 阅读 · 0 评论 -
求二进制中1的个数
求二进制中1的个数 提出问题: 对于任意的一个无符号整形变量,求其二进制表示中1的个数,要求算法的执行效率尽可能的高效。 解法一:大家最容易想到的方法 int Count1(int v) { int num=0; while(v) { if(v%2==1) num++; v=v/2; } return num; } 解法二:使用位运算 int Coun原创 2014-03-19 21:39:56 · 876 阅读 · 0 评论 -
最大子数组和的扩展问题
最大子数组和的扩展问题 提出问题: 1,要求返回最大子数组的起始结束位置; 2,如果数组(A[0],A[1].....A[n-1])首尾相连,也就是我们允许找到一段数字(A[i],A[i+1]...A[n-1],A[0],A[1]...A[j]),求其最大子数组和; 对于问题1的解法: 返回始末位置还是比较容易的,我们知道,每当当前子数组和的小于0时,便是新一轮子数组的开始,每当原创 2014-04-15 23:57:47 · 910 阅读 · 0 评论 -
最长递增子序列
最长递增子序列 问题: 求一个一维数组中最长递增子序列的长度。 解法1: 很明显用动态规划的算法,选取下面的阶段(这种选法极为常见),可使阶段间的关系具有无后效性。 阶段:在所有以元素k结尾的子数组中,选出其中的最长递增子序列,k=1,2...n。 状态:以元素k结尾的最长递增子序列中只有一个最长的递增子序列。 决策:决定元素k结尾的最长递增子原创 2014-05-25 00:37:42 · 1257 阅读 · 0 评论