编程之美
文章平均质量分 70
烟蓑雨笠
这个作者很懒,什么都没留下…
展开
-
寻找发帖“水王”
寻找发帖“水王”提出问题:发帖“水王”指的是发帖数目超过了总帖数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个发帖“水王”吗?解法一:大家最直接能想到的方法是:对所有的ID排序。然后再扫描一遍排好的ID列表,统计各个ID出现的次数。如果某个ID出现的次数超过总数的一半,那么就输出这个ID。解法二:对ID原创 2014-03-29 21:36:54 · 1057 阅读 · 0 评论 -
计算字符串的相似度
计算字符串的相似度提出问题许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程度。我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为:1.修改一个字符(如把“a”替换为“b”)。2.增加一个字符(如把“abdd”变为“aebdd”)。3.删除一个字符(如把“travelling”变为“traveling”)。比如,对于“abcdef原创 2014-05-23 21:28:28 · 972 阅读 · 0 评论 -
数组循环移位
数组循环移位提出问题:设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。解法一:我们先试验简单的方法,可以每次将数组中的元素右移一位,循环K次。虽然这个算法可以实现数组的循环右移,但是时间复杂度为O(N*K)。大家开始可能会有这样的潜在假设,KN,右移K-N之后的数组序列跟右移K位的结果是一样的。进而可以得出一条通用的规原创 2014-04-12 18:02:55 · 1235 阅读 · 0 评论 -
快速寻找满足条件的两个数
快速寻找满足条件的两个数提出问题:能否快速找出一个数组中的两个数字,让这两个数字的和等于一个给定的值,为了简化起见我们假设这个数组中至少存在一组满足要求的解。例如有如下两个数组,5,6,1,4,7,9,8 给定sum=101,5,6,7,8,9给定sum=10解法一:这个题目也不是很难,也很容易理解。但是要得出高效的解法,还是需要一番思考的。原创 2014-04-09 20:23:07 · 971 阅读 · 0 评论 -
二维子数组之和的最大值
二维子数组之和的最大值我们在前面分析了一维数组的子数组之和最大值的问题(详情请见博客:子数组之和的最大值),以及它的一些扩展问题(详情请见博客:最大子数组和的扩展问题),那么如果是二维数组又该如何求呢???解法一:最直接的方法当然是直接枚举每一个矩形区域,然后再求这个矩形区域中元素的和。#include#include#define MAX 1005#define INF 0原创 2014-05-04 21:03:19 · 1318 阅读 · 0 评论 -
最大公约数问题
最大公约数问题提出问题:写一个程序,求两个数的最大公约数(Greatest Common Divisor,GCD)。如果两个正整数都很大,有什么简单的算法吗?例如,给定两个数1100 100 210 001,120 200 021,求出其最大公约数。解法一:求最大公约数是一个很基本的问题。早在公元前300年左右,欧几里得就给出了高效的解法—辗转相除法。例如:F(原创 2014-04-02 19:00:14 · 1254 阅读 · 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 · 1161 阅读 · 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 · 1013 阅读 · 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 · 1167 阅读 · 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 · 891 阅读 · 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 · 950 阅读 · 0 评论 -
最长递增子序列
最长递增子序列问题:求一个一维数组中最长递增子序列的长度。解法1:很明显用动态规划的算法,选取下面的阶段(这种选法极为常见),可使阶段间的关系具有无后效性。阶段:在所有以元素k结尾的子数组中,选出其中的最长递增子序列,k=1,2...n。状态:以元素k结尾的最长递增子序列中只有一个最长的递增子序列。决策:决定元素k结尾的最长递增子原创 2014-05-25 00:37:42 · 1269 阅读 · 0 评论