![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
编程之美
文章平均质量分 70
天地一扁舟
这个作者很懒,什么都没留下…
展开
-
编程之美:第四章 数字之趣 4.10_2数字哑谜和回文
/*2有这样一个乘法算式:人过大佛寺*我=寺佛大过人这里面每一个字都代表着一个数字,并且不同的字代表的数字不同,你能把这些数字都找出来吗?输出:21978*4=87912*/#include #include bool isDifferent(int* pArr,int iLen){ int iMark[10] = {0}; for(int i = 0 ; i <原创 2015-08-04 01:04:03 · 679 阅读 · 0 评论 -
编程之美:第四章 数字之趣 4.11扫雷游戏的概率
/*扫雷游戏的概率:用户的第一次点击不会碰到任何地雷,程序在此之后随机放地雷。第二次点击的时候要小心了,可能遇雷身亡。在16*16的地雷阵中,有40个地雷。用户点了两下,出现以下局面,分析图中的一个局面问题1:当这个游戏有40个地雷没有被发现的时候,A,B,C三个方块有地雷的概率(P(A,P(B),P(C))各是多少#A##1##B##2##C#问题2:这个游戏局面一共原创 2015-08-04 01:03:41 · 1454 阅读 · 0 评论 -
编程之美:第四章 数字之趣 4.9数独知多少
/*数独知多少如图是一个已经完成的数独,图中每一行,每一列和九个3*3的小矩阵都没有重复的数字出现。下图是另一个填好的数独。问题:一共有多少种不同的数独解答呢?其中有多少种是独立的解答呢?如果我们要用一个简单的字符串来表示各种数独,例如"125864...685219",如何保证一一对应的基础上,让字符串的长度最短?独立的解答到底是什么?如何定义独立这种关系。如果任意交换数独的原创 2015-08-04 01:02:03 · 819 阅读 · 0 评论 -
编程之美:第四章 数字之趣 4.5磁带文件存放优化
/*磁带文件存放优化:磁带是一种线性存储设备,一个文件在磁带上的存储区域是完整而且连续的,而多个文件的存储区域是相互独立且连续分布的。磁带没有山区,柱面,磁道等,所以再进行文件寻址时需要耗费线性时间,即要定位到磁带上的第n个文件,需要依次经过前面的n-1个文件的磁带长度。磁盘式存储设备一半能以低于线性时间的效率进行寻址,但他可以进行海量存储。File1 File2 File3大型数原创 2015-08-04 00:57:51 · 620 阅读 · 0 评论 -
编程之美: 第三章 结构之法 3.5最短摘要的生成
/*最短摘要的生成;输入一些关键词之后,搜索引擎会返回许多结果,每个结果都包含一段概括网页内容的还要。标题和URL之间的内容就是我们所说的摘要假设给定的已经是网页分词之后的结果,词语序列数组为W。其中W[0],W[1],...,W[N]为一些已经分好的词语。假设用户输入的搜索关键词为数组Q,其中Q[0],Q[1],...,Q[m]为所有输入的搜索关键词。这样,生成的最短摘要实际上就是一原创 2015-08-04 00:53:14 · 575 阅读 · 0 评论 -
编程之美:第四章 数字之趣 4.10数字哑谜和回文
/*数字哑谜和回文:1神奇的9位数。能不能找出符合如下条件的9位数:这个数包括了1~9这9个数字;这个9位数的前n位都能被n整除,若这个数表示为abcdefghi,则ab可以被2整除,abc可以被3整除......abcdefghi可以被9整除2有这样一个乘法算式:人过大佛寺*我=寺佛大过人这里面每一个字都代表着一个数字,并且不同的字代表的数字不同,你能把这些数字都找出来吗?分原创 2015-08-04 01:02:41 · 758 阅读 · 0 评论 -
编程之美:第四章 数字之趣 4.3买票找零
/*买票找零:每张球票50元,现有2*n个人排队购票,其中有n个人手持50元的钞票,另外n个人手持100元的钞票,假设开始售票时没有零钱找。问这2*n个人有多少种排队方式,不至于售票处出现找不开钱的局面?注意至少要保证排在前面的持50元的人数>=持100元的人数解法1:从队首往后数,手持100元的球迷总比手持50元的球迷少,可以把钱召开。联想到括号匹配问题。假设每个手持50元的球原创 2015-08-04 00:55:19 · 815 阅读 · 0 评论 -
编程之美:第四章 数字之趣 4.2瓷砖覆盖地板
/*瓷砖覆盖地板:原来的地板铺有N*M块正方形瓷砖,商店只提供长方形瓷砖,现在一块长方形瓷砖相当于于原来的两块正方形瓷砖,能否用1*2的瓷砖去覆盖N*M的地板呢本质:斐波那契递推数列公式f(i) = f(i-1) + f(i-2)分析:N*M的地板有以下几种可能:1如果N=1,M为偶数的话,显然1*2的瓷砖可以覆盖1*M的地板,需要M/2块瓷砖2如果N*M为奇数,也就是N和M原创 2015-08-04 00:53:36 · 1608 阅读 · 0 评论 -
判断单链表是否有环
/*判断单链表是否有环,如果有,把指向环的开始指针返回;如果没有环,返回NULL这个程序:设置两个指针,一个pSlow,一个pFast,pSLow每次走一步,pFast每次走两步,如果后面pSlow->_next等于NULL了,但是pFast还没有等于pSlow,那么不存在环否则若pFast == pSlow表明存在环在确认存在环的基础上重新设置,pOri等于链表头指针,而pSlow不变,原创 2015-08-04 01:05:46 · 483 阅读 · 0 评论 -
编程之美:第四章 数字之趣 4.7蚂蚁爬杆
/*蚂蚁爬杆:有一个27厘米的细木杆,在第3厘米,7厘米,11厘米,17厘米,23厘米这五个位置各有一只蚂蚁,木杆很细,不能同时通过通过两只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,它们会同时调头朝相反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁离开木杆的最短时间和最长时间。解法2:每一个复杂问题的背后,都原创 2015-08-04 01:01:08 · 667 阅读 · 0 评论 -
编程之美:第四章 数字之趣 4.8三角形测试用例
/*三角形测试用例:输入三角形的三条边长,判断是否能构成一个三角形(不考虑退化三角形,即面积为0的三角形),是什么样的三角形(直角,锐角,钝角,等边,等腰)函数声明:byte GetTriangleType(int,int,int)1如何用一个byte来表示各种输出情况2如果你是一名测试工程师,应如何写测试用例来完成功能测试?问题1的解法:分为图形{非三角形 {三角形{原创 2015-08-04 01:00:28 · 824 阅读 · 0 评论 -
编程之美:第四章 数字之趣 4.6桶中取黑白球
/*桶中取黑白球:有一个桶,里面有白球,黑球各有100个,人们按照以下规则把球取出来:1每次从桶里面拿出两个球2如果是两个同色的球,那么就放入一个黑球3如果是两个异色的球,就再放入一个白球问:最后桶里面只剩下一个黑球的概率是多少?分析:简化规模,从简单到难来找规律。先假设4个球的情况。解法1:假设桶里面各有2个白球和黑球。用一个set(黑球数目,白球数目)表示桶里面黑白球个原创 2015-08-04 00:59:20 · 689 阅读 · 0 评论 -
编程之美:第四章 数字之趣 4.4点是否在三角形内
/*点是否在三角形内:如果一个二维坐标系中,已知三角形顶点的坐标,那么对于坐标系中的任意一点,如何判断该点是否在三角形内(点在三角形边线上也可)?假设三角形顶点的坐标为ABC(逆时针),需要判断点D是否在该三角形内。分析:利用垂涎的交点可以判断。如果点D在三角形内,所有的垂线交点都在三角形的边线之内。如果点D在三角形之外,则垂线的交点就会在三角形边线的延长线上。但是钝角三角形是不可取原创 2015-08-04 00:56:25 · 696 阅读 · 0 评论 -
编程之美:第四章 数字之趣 4.1金刚坐飞机问题
/*金刚坐飞机问题:现在有一班飞机要起飞,乘客们正准备按机票号码(1,2,3,...,N)依次排队登记,突然来了一只大猩猩。它也有飞机票,但是他插队第一个登上了飞机,然后随意地选择了一个座位坐下了。乘客有两种反应1其他乘客也随意坐2如果自己位置没有被占就坐下,否则随机选择另一个位置这两种情况下,第i个乘客(除去金刚之外)做到自己原机票位置的概率是多少。1问题1的解法:F(i)原创 2015-08-04 00:54:53 · 715 阅读 · 0 评论 -
编程之美:第三章 结构之法 3.1字符串移位包含的问题
/*字符串移位包含的问题:给定两个字符串s1和s2,要求判定s2是否能够被s1做循环移位得到的字符串包含,例如给定s1 = AABCD和s2 = CDAA,返回true;给定s1 = ABCD,s2 = ACBD,返回false分析与解法:解法1:最直接的方法是对s1进行循环移位,再进行字符串包含的判断,从而遍历其所有的可能性解法2:对循环移位之后的结果进行分析:s1 = A原创 2015-08-04 00:51:08 · 529 阅读 · 0 评论 -
编程之美:第一章 1.12拈石游戏分析
/*拈游戏分析:有N块石头和两个玩家A和B,玩家A先将石头分成若干堆,然后按照BABA...的顺序不断轮流取石头,能将剩下的石头一次取光的玩家获胜。每次取石头的时候,每个玩家只能从若干堆石头中任选一堆,取这一堆石头中任意数目(大于0)个石头。问:玩家A要怎样分配和取石头才能保证自己有把握取胜?经分析得出:若石头数目是偶数,则分成两堆,形成(X,X)局面,此时无论对手从一原创 2014-09-14 21:02:15 · 1084 阅读 · 0 评论 -
编程之美:第一章 1.13 NIM两堆石头的游戏
/*NIM两堆石头的游戏:假设有两堆石头,有两个玩家会根据如下的规则取石头:没人每次可以从两堆石头中各取出数量相等的石头,或者仅从一堆石头中取出任意数量的石头;最后把剩下的石头一次拿光的人获胜。对于数量分别为1和2的两堆石头,取石头的第一个玩家必定会输掉游戏,因为它要么只能从任意一堆石头中取出一块石头,要么只能从两堆中各取出一块石头。但无论采用哪种方式取,最后剩下的石头恰好原创 2014-09-14 21:03:34 · 1191 阅读 · 0 评论 -
编程之美---解题总结:第二章 数字之魅 2.7最大公约数问题
/*最大公约数问题:写一个程序,求两个正整数的最大公约数(Greatest Common Divisor,GCD)。如果两个正整数都很大,有什么简单的算法解法2:用到了取模运算,称为算法瓶颈。如果一个数能够同时整除x和y,则比能同时整除x-y和y;而能够同时整除x-y和y的数也必定能够同时整除x和yf(x,y) = f(x-y,y),在实际操作中,如果x<y,可以先交换,边求...原创 2019-08-08 08:30:02 · 137 阅读 · 0 评论 -
编程之美:第一章 1.5快速找出机器故障
/*快速找出机器故障:为了保证搜索引擎的服务质量,我们需要保证每份数据都有多个备份假设一个机器仅存储了一个标号为ID的记录(假设ID是小于10亿的整数),假设每份数据保存了两个备份,这样就有两个机器储存了同样的数据。1在某个时间,如果得到一个数据文件ID的列表,是否能够快速地找出这个表中仅出现一次的ID?2如果已经知道只有一台机器死机(也就是说只有一个备份都是)呢?如果有两原创 2014-09-14 20:49:34 · 734 阅读 · 0 评论 -
编程之美:第一章 1.10双线程高效下载
/*双线程高效下载:下载一块数据,写入硬盘,然后再下载,再写入硬盘,不断重复这个过程,直到所有的内容下载完毕为止。能否对此进行优化?1假设所有数据块的大小都是固定的。你可以使用一个全局缓存区:Block g_buffer[BUFFER_COUNT]2假设两个基本函数已经实现(你可以假定两个函数都能正常工作,不会抛出异常)bool GetBlockFromNet(Bl原创 2014-09-14 21:00:49 · 788 阅读 · 0 评论 -
编程之美:第一章 1.9高效率地安排见面会
/*每一个面试是一个整数的闭区间[B[i],E[i]],表示开始时间和结束时间,有N个面试要进行,求最少的面试点思路:按开始时间排序,使用贪心策略,每一个面试用一个最小的正整数k来表示可行的颜色,当然如果重叠了就必须使用一个新的颜色输入:4(N场见面会,接下来有N行,每一行表示节目的开始时间和结束时间)1 52 33 43 6输出:3*/#i原创 2014-09-14 20:56:53 · 906 阅读 · 0 评论 -
编程之美:第一章 1.8电梯调度算法
/*电梯调度算法:微软有6部电梯,每层都有人上下,电梯在每层都停。每次电梯从一层往上走时,只允许电梯停在其中的某一层。所有的乘客都从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼的时候,每个乘客选择自己的目的层,电梯则自动计算出应停在的楼层。电梯停在那一层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。分析:本质是优化问题。如何寻原创 2014-09-14 20:54:18 · 1052 阅读 · 0 评论 -
编程之美:第一章 1.7光影切割问题
/*光影切割问题:不少人爱玩CS。仓库的地面会因为阳光从屋顶的漏洞或者窗口照射进来而形成许多光照区域和阴影区域。假设不同区域的边界都是直线,我们把这些直线都叫做光影线。并假设没有光影线是平行于Y轴的,且不存在三条光影线相交于一点的情况。那么,如果我们需要快速计算某个时刻,在X坐标[A,B]区间的地板上被光影划分成多少块。如何设计算法题目一旦找不到规律:那么应该通过从最简单的原创 2014-09-14 20:51:11 · 969 阅读 · 0 评论 -
编程之美:第一章 1.6饮料供货
/*饮料供货:大家对每一种饮料的满意度是知道的。微软供应部每天供应总量为V的饮料。每种饮料的单个容量都是2的方幂,比如王老吉,都是2^3 = 8升的,可乐都是2^5 = 32升的。每种饮料也有购买量的上限。统计数据中用饮料名字,容量,数量,满意度描述每一种饮料。如何求出保证最大满意度的购买量?分析:假设STC提供n种饮料,用(Si,Vi,Ci,Hi,Bi)(对应的是饮料的名原创 2014-09-14 20:51:05 · 1072 阅读 · 0 评论 -
编程之美:第一章 1.16 24点游戏
/*24点游戏:给玩家4张牌,每张牌的面值在1~13之间,允许其中有数值相同的牌。采用加减乘除,允许中间运算存在小数,并且可以使用括号,但每张牌只能使用一次,尝试构造表达式,使其运算结果为24.输入:n1,n2,n3,n4输出:若能得到运算结果为24,输出对应表达式输入:11,8,3,5输出:(11-8)*(3+5)=24解法1:穷举法,运算符号4种,每原创 2015-08-02 00:21:00 · 629 阅读 · 0 评论 -
编程之美:第一章 1.15构造数独
/*构造数独:数独的棋盘是由九九八十一个小方格组成的。玩家在每个小格子中,分别天上1至9的任意一个数字,让整个棋盘每一行,每一列,以及每一个3*3的小矩阵中的数字都不重复。使用一个二维数组来存储,每一个元素对应数独中的一个数。但考虑到每一个格子有若干属性,可以把每个格子抽象为一个对象,把整体看成9*9个格子对象生成游戏初始局面:可以向生成一个完整合法的解,然后再随机地去掉一些数原创 2014-09-14 21:08:49 · 1278 阅读 · 0 评论 -
编程之美:第一章 1.4 买书问题
/*买书问题:买哈利波特,共有5本。假设每一卷单独销售需要8欧元,一次购买不同的两卷可以扣除5%的费用,三卷则更多。折扣如下:本数 折扣2 5%3 10%4 20%5 25%在一份订单中,根据购买的卷数及本数,就会出现不同折扣,但是一本书只会应用一个折扣规则。比如,读者买了两本卷1,一本卷2,那么可以享受5%的折扣。另外一本原创 2014-09-14 20:47:55 · 922 阅读 · 0 评论 -
编程之美:第一章 1.14连连看游戏设计
/*连连看游戏设计:主要包含游戏局面的状态描述,游戏规则的描述:状态的合法转移(哪些操作满足规则,经过这些操作,达到哪些状态)。自动机模型适合描述游戏设计。如何求出相同图形之间的最短路径,最短路径的转弯数目最少,转弯数目最少时,经过格子数目尽可能少。最短路径中:把最短路径问题的目标函数改为从一个点到另一个店的转弯次数。广度优先搜索首先把图形A(x1,y1)压入队列,然后扩展A(原创 2014-09-14 21:07:13 · 1603 阅读 · 0 评论 -
编程之美:第一章 1.3 一摞烙饼的排序
/*一摞烙饼的排序:把一摞并按照大小次序摆好,小的在上面,大的在下面。由于我一只手托着盘子,只好用另一只手,一次抓住最上面的几块饼。把它们上下颠倒一下,反复几次,烙饼就排好序了。请写一个程序,对于n块大小不一的烙饼,输出最优化的翻饼过程。分析:每次我们只能选择最上方的一摞饼,一起翻转。不能一张一张直接抽取出来,然后进行插入,也不能交换任意两块饼。因此,基本的排序方法不好原创 2014-09-14 20:41:33 · 865 阅读 · 0 评论 -
编程之美:第一章 1.2 中国象棋将帅问题
/*中国象棋将帅问题:自古将帅不能照面 __ __ __10 将987654321 帅 a b c d e f g h iA表示将,B表示帅,A被限制在{d10,f10,d8,f8}中,B被限制在{d3,f3,d1,f1}中。每一步A,原创 2014-09-14 20:39:59 · 833 阅读 · 0 评论 -
编程之美:第一章 1.1 让CPU占用率曲线听你指挥
/*让CPU占用率曲线听你指挥:写一个程序,让用户来决定Windows任务管理器的CPU占用率。实现下面的要求:1 CPU的占用率固定在50%,为一条直线2 CPU的占用率为一条直线,具体占用率由命令行参数决定(参数范围1~100)3 CPU的占用率状态是一条正弦曲线CPU的占用率 = CPU忙的时间(执行程序)/刷新周期总时间System Idle Process占用原创 2014-09-14 20:39:45 · 1193 阅读 · 0 评论 -
编程之美: 第二章 数字之魅 2.16求数组中最长递增子序列
/*求数组中最长递增子序列:(这里不要求相邻)写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度。例如,在序列1,-1,2,-3,4,-5,6,-7中,最长递增子序列的长度为4(如1,2,4,6)分析:也就是找一个标号的序列,b[0],b[1],...,b[m] (0<= b[0] < b[1] <... <b[m]<N),使得array[ b[0] ]原创 2015-08-03 00:59:22 · 550 阅读 · 0 评论 -
编程之美:第三章 结构之法 3.8求二叉树中结点的最大距离
/*求二叉树中节点的最大距离:如果我们把二叉树看成一个图,父子之间的连线是双向的,定义距离为:两个节点之间边的个数写一个程序求一颗二叉树中相距最远的两个节点之间的距离分析:相距最远的两个节点,一定是两个叶子节点,或者是一个叶子节点到它的根节点(假如这棵树只有左子树或只有右子树的话)解法1:相距最远的两个节点一定是叶子节点:对于任意一个节点,以该节点为根,假设这个根有k个孩子节原创 2015-08-03 00:54:54 · 498 阅读 · 0 评论 -
编程之美:第三章 结构之法 3.3计算字符串的相似度
/*计算字符串的相似度:对于不同的字符串。我们定义一套操作方法来把两个不相同的字符串变相同,具体方法:1修改一个字符(如把'a'变成'b')2增加一个字符(如把'abdd'变成'aebdd')3删除一个字符(如把"travelling"变为"traveling")比如,对于“abcdefg”和"abcdef"这两个字符串来说,我们认为可以通过增加/减少一个"g"的方式来达到目的。上面的原创 2015-08-03 00:54:08 · 529 阅读 · 0 评论 -
编程之美:第三章 结构之法 3.7队列中取最大值操作问题
/*队列中取最大值操作问题:假设有这样一个拥有3个操作的队列1EnQueue(v):将v加入到队列中2DeQueue():使队列中的队首元素删除并返回此元素3MaxElement:返回队列中的最大元素请设计一种数据结构和算法,让MaxElement操作的时间复杂度尽可能地低。队列底层的数据结构不一定要用数组来实现,还可以使用其他特殊的数据结构来实现。这道题目:参见剑指。可以用原创 2015-08-03 00:53:18 · 571 阅读 · 0 评论 -
编程之美:第二章 数字之魅 2.3寻找发帖水王
/*寻找发帖水王:本质:寻找出现超过一半次数的人如果已经排序,那么中序数就是那个人,即下标是,这个列表的第n/2项是(从0开始编号)。如果每次删除两个不同的id,可以降低时间复杂度输入:71 2 3 2 4 2 281 2 3 2 4 2 2 5输出:2没有*/#include const int MAXSIZE = 10000;void halfTimesNu原创 2015-08-02 00:14:18 · 516 阅读 · 0 评论 -
编程之美: 第二章 数字之魅 2.9斐波那契数列
/*斐波那契数列:解法二:求通项公式的特征方程为x^2 = x + 1所以x1,2 = (1+ - 根号5 )/2;所以存在A,B使得F(n) = A*((1+根号5)/2)^n + b*((1-根号5)/2)^n带入F(0)=0,F(1) = 1解得A = 根号5/5,B= -根号5/5F(n) = 根号5/5 * ((1+根号5)/2)^n - 根号5/5 * ((1-原创 2015-08-02 00:18:33 · 504 阅读 · 0 评论 -
编程之美: 第二章 数字之魅 2.4 1的数目
/*1的数目:给定一个十进制正整数N,写下从1开始,到N的所有整数然后数一下其中出现的所有1的个数例如:N=2,写下1,2这样只出现了1个1N=12,写下1,2,3,4,5,6,7,8,9,10,11,12,这样1的个数是5问题是:1写一个函数f(N),返回1到N之间出现的1的个数,比如f(12) = 5,2满足条件f(N) = N的最大N是多少?剑指解法:需要用递归,拆分原创 2015-08-02 00:17:53 · 480 阅读 · 0 评论 -
编程之美:第二章 数字之魅 2.5寻找最大的k个数
/*寻找最大的k个数:解法1:如何避免对后N-k个数的排序,选择排序和交换排序都是不错的选择,O(N*k),如果K<=log2N时,那么可以选择部分排序。解法三:寻找N个数中最大的K个数,本质就是寻找最大的K个数中最小的那个,也就是第K大的数。可以使用二分搜索,对于一个给定的数p,可以在O(N)的时间复杂度内找到所有不小于p的数。加入N个数中最大的数为Vmax,最小的数位Vmin,那原创 2015-08-02 00:14:17 · 591 阅读 · 0 评论 -
编程之美: 第二章 数字之魅 2.2不要被阶乘吓到
/*不要被阶乘吓到:1给定一个整数N,那么N的阶乘等于N!,末尾有多少个0呢,例如N=10,N!=3628800,N!的末尾有两个02求N!的二进制表示中最低位为1的位置。分析:哪些数相乘能够得到10如果N!= K*10^M,且K不能被10整除,那么N!末尾有M个0,再考虑对N!进行质数分解,N!=(2^X)*(3^Y)*(5^Z)...,由于10 = 1*5,所以M只跟X和Z有关,原创 2015-08-02 00:11:55 · 520 阅读 · 0 评论