算法
文章平均质量分 69
zy__
这个作者很懒,什么都没留下…
展开
-
编程之美 - 计算字符串相似度
问题描述:有两个不同的字符串,通过使用一套操作方法可以把两个字符串变成一样的。例如:1) "a" 和 "b" ==> 把a变成b,或把b变成a 变化了一次2) "abc" 和 "ade" ==> 把bc变成de,或把de变成bc 变化了两次3) "abcd" 和 "abcde" ==> 删除e 变化了一次每操作一次,两个字符串的距离就原创 2016-08-05 08:35:21 · 1383 阅读 · 0 评论 -
编程之美 - 1 的数目
问题:给定一个十进制整数N,写下从1开始到N的所有数字,然后数一下其中1的个数。例如N = 16,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16其中 1 的个数为 9 个。分析:第一种方式比较暴力, 一个数字一个数字的查。复杂度为 N*(log2N)第二种方式找规律,如例子中N原创 2016-04-07 21:53:55 · 951 阅读 · 0 评论 -
趣味算法-巧填运算符
给定一个整数数组,和一个单独的数字,在数组的每一个元素中间填加 "+"或"-" 使其运算结果等于单独的数字例如给定的数组为{7 2 4} ,数字为 9。运算结果为7-2+4=9 规则1:数组中元素的位置不能变化。规则2:如果无法实现则输出 Invalid举例:Input:1 2 3 4 101 2 3 4 5Output:1+2+3原创 2016-02-28 17:10:45 · 1896 阅读 · 0 评论 -
编程之美 - 抓石头游戏(3)
游戏规则: 有两堆石头,玩家A 和 B,两个人可以从一堆石头中取任意数目的石头或从两堆石头中取相同数量的石头。最后取得所有石头的人胜。书中的分析:从最简单的情况入手只有一块石头 == > 先拿的一定会赢。如果两堆石头数目相等 X:X ==> 先拿的一定会赢。如果两堆石头数目为 1 和 2 ==> 先拿的一定会输。那么1 和 2 就原创 2016-03-11 08:57:09 · 1201 阅读 · 0 评论 -
趣味算法-打印数字 (1)
给出一个数字N,按下面的规律打印图形。例如 N=3 输出:1*2*37*8*94*5*6N = 5 输出:1*2*3*4*511*12*13*14*1521*22*23*24*2516*17*18*19*206*7*8*9*10示例程序:#include using namespace std;void pri原创 2016-02-24 20:03:00 · 708 阅读 · 0 评论 -
趣味算法-求波峰波谷最大值
给一个数组,求它的最大的波峰波谷的落差。举例:数组 A={2, 3, 6, 5, 7, 9}, 其中 6 和 9 被看做是波峰,2和5则是波谷。D[2, 6]=4, D[6,5]=1, D=[5,9]=4. 则 Thus, MaxD(A)=4.想法:波峰不一定是数组中的最大值,他是趋势向下的转折点,波谷也不一定是数组中的最小值,他是趋势向上的转折点。数组中最边上的两个元素比较特殊原创 2016-03-07 20:36:20 · 14751 阅读 · 0 评论 -
趣味算法-0的迷宫
一个 5*5的矩阵,其中包含0-24 25个数字,数字在矩阵中没有顺序,其中0比较特殊,它可以和上下左右不同的数字进行交换,但一定在矩阵的范围内。0和上面的元素交换可以用 "U"表示;0和下面的元素交换可以用 "D"表示;0和左面的元素交换可以用 "L"表示;0和右面的元素交换可以用 "R"表示;举例:[20, 18, 7, 19, 10 24, 4原创 2016-03-07 20:14:35 · 446 阅读 · 0 评论 -
编程之美 - 寻找灌水王及扩展问题
问题描述:在一个论坛中,一个ID发的帖子超过了半数,问怎样能快速的找出这个ID。算法描述:书中给出了几种不同的思考方式,1) 先排序,然后逐个统计2) 排序后,第 N/2个元素一定是这个ID最好的方式是第三种,每次删除两个不同的ID,那么水王的ID在剩下的列表中仍然超过一半。或者可以这样理解 假设总共有10个帖子,6个是水王的,假设水王的原创 2016-03-17 20:23:06 · 672 阅读 · 0 评论 -
编程之美 - 抓石头游戏(2)
游戏规则: N块石头,两个玩家 A,B,A负责将石头分成M堆,然后按BABA顺序来抓取,每人每次可以从任意堆抓取大于1的任意块石头,取得最后一块石头的人赢。书中的分析:如果每堆石头只有一块,当M是奇数的时候,一定是先抓的赢。如果有两块石头,分成两堆 1:1,那先抓的一定输。扩展一下,如果有偶数块石头,平均分成两堆 X:X,那先抓的一定会输。原创 2016-02-18 09:05:11 · 1359 阅读 · 0 评论 -
编程之美 - 安排见面会问题
问题:有n个人会参加m个会议,其中一个人会参加m个会议中的若干个。怎样安排m个会议的日程使效率最高。思路:书中的想法是将它转换为一个图的问题原创 2016-02-01 20:07:39 · 943 阅读 · 0 评论 -
编程之美 - 一排石头游戏及扩展问题
问题:一堆石头排成一排,两个人轮流从其中抓取一块或两块石头(两块石头必须是挨着的),谁拿到了最后的石头,谁就是赢家,编写算法保证先抓的人一定能赢。思路:假设有三块石头,甲先拿中间的一块,这样无论乙怎么拿甲都会赢。如果有四块石头,甲先拿中间的两块,这样无论乙怎么拿甲也会赢。再扩展一下,如果有五块石头,甲先拿中间的一块,如果下面乙拿一块,甲就拿和乙中心对称的一块,这样甲还是会赢原创 2016-02-10 11:42:19 · 1730 阅读 · 0 评论 -
编程之美 - 将帅问题
在中国象棋棋盘上,输出将帅不冲突的所有的位置,只使用一个变量。原创 2015-12-27 13:16:15 · 548 阅读 · 0 评论 -
编程之美 - 爬楼梯问题
问题: 电梯在高峰时为了提高效率,当人们进入电梯选择好楼层后,根据算法只停在其中的一层。这个算法要求电梯里所有的人爬楼梯的总数最少。想法 I:算是穷举法吧,把每个人可能会爬的楼层数都计算出来,然后逐一求和后,再找出和最小的值。假设有10层楼,5个人分别到3,6,9,10,5 层,穷举一下可以得到2 5 8 9 4 = 28 停在第原创 2016-01-26 21:21:45 · 2488 阅读 · 0 评论 -
编程之美 - 找出故障机器
给出一个数字的列表,是否能够快速的找出其中只出现一次的数字。想法: 定义一个动态的数组,读一个数字,如果这个数字没出现在动态数组中,则将它放在数组中,如果数组中已经有了,则删除。 最后剩下的就是只出现了一次的数据。原创 2016-01-09 18:43:27 · 583 阅读 · 0 评论 -
编程之美 - 买书问题
问题描述:一套书共 5 卷,单独买每一卷的每一本8元,没有折扣。 如果一次买不同的卷的几本会有相应的折扣,折扣定义如下:不同的 2本 : 折扣 5% 不同的 3本 : 折扣 10% 不同的 4本 : 折扣 20% 不同的 5本 : 折扣 25%一份订单中多本书中,不同的组合可能有不同的价格,设计算法计算出最低的价格。原创 2016-01-07 09:02:32 · 744 阅读 · 0 评论 -
编程之美 - 光影切割问题
在一个平面内有一个矩形区域,直线穿过矩形可以将其分割为不同的区域,且在这个平面中不存在三条直线相交一点的情况。求当有N条直线穿过矩形时,它被分割为多少个区域?例如: 图中有两条直线将矩形分割为 4 个区域。直线条数交点个数分割部分102214原创 2016-01-22 09:08:52 · 1294 阅读 · 0 评论 -
编程之美 - 浮点数的精确表示
问题描述:如何将浮点数(小数)转换为分数的形式,这样可以更精确的表达出浮点数的值。问题分析:小数可以分为两种,有限小数和无限循环小数。有限小数的处理相对简单:只要把它乘以10的N次方,转换为整数,再和10的N次方都除以它们的最大公约数即可。例如:0.25 把它乘以 10的2次方 变成25, 25/100 分子分母除以最大公约数25变成1/4即可。原创 2016-04-14 21:44:35 · 763 阅读 · 0 评论 -
编程之美 - 寻找合适的数字
问题描述:给一个整数N,求一个整数M,使M*N 的十进制结果中只有 1 和 0。问题分析:问题从结果入手,十进制表示只有 1 和 0,这个数字的集合有规律,例如: 1,10,11,100,101,110,111.....10k次方与前面的每个的数的和。例如 k=1 ==> 10 ,在 10这个阶段的数字有 1 + 10 = 11例如 k=2 ==> 100 ,在原创 2016-04-14 23:12:55 · 1045 阅读 · 0 评论 -
编程之美 - 分层遍历二叉树
问题描述一棵二叉树,按从上到下,从左到右的方式进行遍历,打印它的所有的节点。例如二叉树输出的结果为abcdef 思路:二叉树遍历的方式为分层方式每一层都可以看做是一个链表,根节点level 0可以看做只有一个元素的链表。当遍历level 0时,可以同时将根节点的左右子树放入level 1的链表中。当遍历level1的链表时可以同理生成原创 2016-10-31 15:46:54 · 1246 阅读 · 0 评论 -
编程之美 - 重建二叉树
问题描述: 给出二叉树先序遍历和中序遍历的结果,根据结果重建二叉树。举例: 例如二叉树先序遍历结果 为 abdcef 中序遍历结果为 dbaecf,现根据结果重构二叉树。思路: 关键需要找到二叉树每一层的根节点和子树的长度。例如先序遍历中根节点必然是第一个 abdcef , 通过中序遍历可以发现 dbaecf a的左侧有两个,右侧有3个,原创 2016-10-30 17:16:11 · 1207 阅读 · 0 评论 -
编程之美 - 无头链表删除节点
问题描述:一个没有头指针的链表,从其中删除任意一个中间节点(非第一个,也不是最后一个)。思路:没有头指针,所以无法使用遍历的方式找到目标节点的上一个节点。但可以使用的是目标节点的下一个节点。因为当前节点是要被删除的,所以当前节点的值已经不需要被保存了,可以直接用下一个节点的值将其替换。然后,直接删除下一个节点即可。代码:void delete_node(原创 2016-08-10 09:05:45 · 1111 阅读 · 0 评论 -
编程之美 - 求二叉树节点的最大距离
问题描述:把在二叉树中,从一个节点到另一个节点的需要经过的边数,定义为距离。求一棵二叉树中,距离最远的两个节点之间的距离是多少?问题分析:最远的节点可能出现两种情况:1) 位于根节点下面两棵不同的子树上,例如节点C和D2) 位于根节点下面同一棵子树上,例如节点 F 和 I,他们位于B子树上。这样问题可以转化为求二叉树子树上的最远节点,根节原创 2016-08-27 10:45:20 · 1401 阅读 · 0 评论 -
编程之美 - 区间重合判断
问题描述:给定一个源区间 (x, y)和若干个无序的目标区间 (x0, y0), (x1, y1), (x2, y2), ...... (xn, yn), 判断源区间是否在目标区间内。思路 1:分解源区间把目标区间逐一的映射在源区间上,可以将源区间分解为更小的区间。最后看是否能将源区间全部分解。例如:源区间 {1,6}, 目标区间 {{2,3}, {3,9}, {1,2}原创 2016-07-07 15:57:40 · 2433 阅读 · 0 评论 -
编程之美 - 电话号码对应英语单词
问题描述:电话的号码盘上一个数字对应着几个字母,一串数字对应着几种字母的组合。现在给定一组数字,列出对应的字母的组合。思路:例如:4对应键盘上 GHI, 2对应键盘上 ABC数字 42 的组合对应的字符串,用树的表现形式: 424:原创 2016-07-18 08:37:05 · 1572 阅读 · 0 评论 -
编程之美 - 数组分割
问题:有一个没有排序,有2N个元素的数组,要求把这个数组分为两部分,分别含有N个元素,并使两个子数组的和最接近。这里的程序主要是计算这个和的值。比如数组 {1, 10, 100, 1000},计算后符合的分法是 {1, 1000} {10, 100} 和算出比较小的就可以了是 110例如数组 {1, 2, 3, 4} 分开后是 {1, 4} 和 {2, 3}原创 2016-07-02 19:28:17 · 1728 阅读 · 0 评论 -
编程之美 - 字符串移位包含
问题描述:两个字符串s1, s2,将s1循环位移,判断s2是否被包含在其中。例如:s1 = "ABCD" s2= "CDA" 将s1循环位移后得到BCDA,s2被包含在s1循环位移后的字符串中。思路 1:将s1移位一次,然后与s2比较一次。如果字符串比较长,效率很低。思路 2:假设保留s1移位的结果,例如:s1 = "ABCD" 位移一次原创 2016-07-11 11:08:03 · 1134 阅读 · 0 评论 -
编程之美 - 只考加法的算术题
问题描述:给定一个正整数 N,将N分解为几个(2个以上)连续的自然数的和。是否所有的数都可以做到。例如 10 = 1 + 2 + 3 + 4。思路:以最简单的方式开始思考:1) N为奇数,奇数可以分解为两个连续的自然数的和。例如 9 = 4+5。2) 当N为偶数,如果N可以被 3 整除, 假设a = N/3,那么N还可以被分解为 a-1,a,a+1三个数3)原创 2016-07-10 09:01:50 · 1061 阅读 · 0 评论 -
编程之美 - 数组循环移位
问题描述:将一个数组向右循环移位 k 位,要求只使用两个参数,时间复杂度为 O(N)。思路 1:采用蛙跳的方式,用当前的元素 i,替换第i+k个元素,这样逐一替换N次后,数组被移位完成。当然这时要区分能两种情况,N能整除k 和 N不能整除k,这时跳的方式是不一样的。时间复杂度 O(N)假设 N = 7 k = 3 (N不能整除k), 假设 N = 9 k原创 2016-06-01 23:03:47 · 1077 阅读 · 0 评论 -
编程之美 - 数组最长子序列
问题描述:求一个一维数组的最长递增子序列,时间复杂度尽可能小。例如:数组 1, -1,2,-3,4,-5,6,-7它的最长递增子序列是 1,2,4,6。思路:创建一个数组,用于记录到它为止递增元素的最大个数。从目标数组的第一个元素开始,寻找从数组0元素开始到当前元素中间的递增的元素个数,并记录。时间复杂度 O(N*N)。#include原创 2016-06-01 23:01:29 · 1917 阅读 · 0 评论 -
编程之美 - 数组最大和的子序列
问题描述:一个数组有N个元素,求这个数组中子数组的最大和。要求:子数组是数组中连续的几个元素数组的元素包含正数,负数,0思路:使用动态规划的方式从第n-1个元素开始,向前累加。如果当前值 大于当前值+以前和则在当前和的位置保存当前值,否则保存当前值+以前和sum[n-2] = max(a[n-2], sum[n-1]+a[n-1]),原创 2016-05-13 09:22:00 · 2593 阅读 · 0 评论 -
编程之美 - 子数组的最大乘积
问题描述:给定一个长度为N的整数数组,只允许用乘法,不许用除法,求数组中任意N-1个数字的最大乘积想法1:计算数组中除去 a[i]以外后的其他数字的乘积,然后在其中找到最大值。s[i] = s[i-1]*arr[i-1]; t[i] = t[i+1]*arr[i+1];p[i] = s[i]*t[i];代码示例中 : calc1()原创 2016-05-13 09:19:20 · 1506 阅读 · 0 评论 -
编程之美 - 满足条件的两个数字及扩展问题
问题描述: 对应函数 find_two快速找出数组中的两个数字,让这两个数字之和等于给定的数字。想法:如果把任意两个数字组合进行尝试的话,运算量是N*N不适合。先将数组进行排序,然后从两头分别取数字进行组合,如果和大于目标数字则在大数字侧找下一个稍小一点的数字。如果和小于目标数字则在小数字侧找下一个稍大一点的数字扩展问题 1: 对应函数 find_th原创 2016-05-13 09:17:36 · 1123 阅读 · 0 评论 -
编程之美 - 二维数组最大和的子序列
问题描述:找出二维数组中的最大和的子序列。二维数组中的子序列是二维数组中的一个方块。思路一:使用暴力的方式,从每一个元素开始,变量以它为左上定点的所有的可构造的方块。时间复杂度 N*N*M*M* sum(MN)函数:getMaxSum1()思路二:参考一维数组的方式,将二维数组的转化为一个一维数组后,再进行求和。例如:在二维数组中选择了 a原创 2016-05-25 10:06:31 · 2185 阅读 · 0 评论 -
编程之美 - 烙饼问题
把一摞烙饼按大的在下,小的在上拍好,一只手一次只能抓住上面的几张饼,把它们上下颠倒个个。反复几次后把饼排好。 问把饼排好需要的最小的次数。原创 2015-12-31 22:27:22 · 1340 阅读 · 0 评论 -
编程之美 - 饮料供货
问题描述公司采购饮料,采购的饮料有一个总量的限制 V0升,同时每种饮料有最大瓶数的限制C(i),大家对每种饮料有一个满意度 H(i),问怎样采购能使总的满意度最高。注: 饮料的包装规格都是2的n次方的整数。想法 I : 动态规划假设: 饮料的种类为 n 每种饮料的购买量为 B(i) (i = 0.. n)原创 2016-01-14 09:00:09 · 755 阅读 · 0 评论 -
基数排序算法分析
基数排序:主要思想是把数字按位进行比较,从个位,十位... 到最高位,取得每个位的单个数字逐一进行比较和移动。由于整数也可以用字符串表达(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数,其他类型也可使用这种方式。原创 2011-12-04 15:56:50 · 5885 阅读 · 0 评论 -
趣味算法-城市之间最短路径
城市之间最短路径:算法描述:(1) 图中所有顶点集合为V,最小生成树顶点集合为U,初始时V包含所有顶点,U中只有起始顶点。(2) 计算下一个顶点到其实顶点V0的最短路径,并加入U。(3) 更新未加入U中的各个顶点到起始顶点的距离值为发现的最小的权值。(4) 重复该计算方法。#include #define MAX_DIST 65535#define MAX_P原创 2012-01-03 10:27:49 · 3924 阅读 · 0 评论 -
趣味算法-城市之间最短总距离
城市之间最短总距离:图为联通图。(1) 图中所有顶点集合为V, 最小生成树顶点集合为U初始时V包含所有顶点,U为空。(2) 从V中选取一个顶点V0,将其加入U。(3) 从V0的邻接顶点中选取边权值最小的Vn,得到最小生成树的一条边,将Vn加入集合U。(4) 再从V-U中再选取一个与V0, Vn邻接的顶点,找出权值最小的边。(5) 重复上述步骤。#incl原创 2011-12-29 22:30:19 · 2871 阅读 · 0 评论 -
趣味算法-Hanoi
趣味算法-Hanoi:主要是说明递归的思路。A B C三个金属棒,有n个盘片,起始时盘片都在n上,要求把所以盘片都移动到C上可以利用B。原则大盘一定要在小盘下面。思路:1) 把起始位置上A的n-1个盘子移动到B上, 这时可以通过C,这时可以移动A上的第n个盘子。2) 把B上的n-1个盘子在都移动到C上,这时可以通过A,这时达到目的,移动完成。注意:参数的顺序和含原创 2012-01-31 11:57:39 · 597 阅读 · 0 评论 -
趣味算法-水仙花数
趣味算法-水仙花数:一个n位正整数(n >= 3), 它的每个位上得数字的n次幂之和等于它本身。1) 计算当前正整数的位数;2) 计算每个位数上n次幂的和;3) 判断是否为水仙花数。#include #include #include // 0: the number is not narcissus number// 1: the number is nar原创 2012-01-24 18:42:32 · 779 阅读 · 0 评论