![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
编程之美
文章平均质量分 61
午后小夕
趁着青春,尽情挥洒,加油
展开
-
求二进制中1的个数
题目描述:对于一个字节(8bit)的变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能的高。解法一: 除以一个2,原来的数字将减少一个0,如果除的过程中有余,那么就表示当前位置有一个1.代码如下:int Count(int v){int num=0;while (v){ if (v%2==1) num++原创 2015-04-18 20:58:41 · 469 阅读 · 0 评论 -
瓷砖覆盖地板
问题:能否用1*2的瓷砖覆盖N* M的地板扩展问题: 求用1*2的瓷砖覆盖2*M的地板有几种方式?原创 2015-05-08 21:39:34 · 1108 阅读 · 0 评论 -
买票找零
解法一:、解法二:原创 2015-05-08 21:53:36 · 468 阅读 · 0 评论 -
字符串移位包含的问题
题目描述: 给定两个字符串s1和s2,要求上是否能够通过s1作循环移位(rotate)得到的字符串包含。例如s1=AABCD和s2=CDAA,返回true,给定s1=ABCD和s2=ACBD,返回false.解法一: 可以使用最直接的方法对s1进行循环移位,再进行字符串包含的判断,从而遍历其所有的可能性。代码如下:char src[5] = "AABCD"原创 2015-04-27 21:33:38 · 657 阅读 · 0 评论 -
计算字符串的相似度
Int CalculateStringDistance(string strA, int pABegin, int pAEnd, string strB, int pBBegin, int pBEnd){if (pABegin > pAEnd){if (pBBegin > pBEnd)return 0;elsereturn pBEnd - pBBegin + 1;}原创 2015-04-27 22:25:03 · 377 阅读 · 0 评论 -
磁带文件存放优化
题目:原创 2015-05-09 21:09:58 · 878 阅读 · 0 评论 -
桶中取黑白球
题目:原创 2015-05-09 22:05:45 · 616 阅读 · 0 评论 -
点是否在三角形内
题目描述: 如果在一个二维坐标系中,已知三角形三个点的坐标,那么对于坐标系中的任意一点,如何判断该点是否在三角形内(点在三角形边线上也认为在三角形内)? 假设三角形的三个点的坐标为ABC(逆时针顺序),需要判断点D是否在该三角形内。原创 2015-05-09 19:54:21 · 999 阅读 · 2 评论 -
蚂蚁爬杆
问题:解答:伪代码如下:void CalcTime(double Length,// length of the stickdouble *XPos,//position of an ant,int AntNum, //number of antsdouble Speed, //speed of antsdouble &Min,//retu原创 2015-05-10 21:27:18 · 1087 阅读 · 1 评论 -
从无头单链表中删除节点
题目描述: 假设有一个没有头指针的单链表,一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个节点),请将该节点从单链表中删除。代码如下:void DeleteRandomNode(node* pCurrent){Assert(pCurrent != NULL);node* pNext = pCurrent->next;if (pN原创 2015-05-05 21:13:57 · 452 阅读 · 0 评论 -
最短摘要的生成
解法一:解法二:代码如下:int nTargetLen = N + 1; //设置目标长度为总长度+1;int pBegin = 0;//初始指针int pEnd = 0;//结束指针int nLen = N;//目标数组的长度为N;int nAbstractBegin = 0;//目标摘要的起始地址int nAbstract原创 2015-05-05 21:55:03 · 494 阅读 · 0 评论 -
队列中取最大值操作问题
题目: 假设有这样一个拥有三个操作的队列: 1.EnQueue(v):将v加入队列中 2.DeQueue:使队列中的队首元素删除并返回此元素 3.MaxElement:返回队列中的最大元素请设计一种数据结构和算法,让MaxElement操作的时间复杂度尽可能地低。解法一:解法二:原创 2015-05-06 20:51:17 · 823 阅读 · 0 评论 -
二分查找算法
问题: 找出一个有序(字典序)字符串数组arr中值等于字符串v的元素的序号,如果有多个元素满足这个条件,则返回其中序号最大的。 int bisearch(char** arr, int b, int e, char* v){//循环结束有两种情况://若minIndex为偶数则minIndex==maxIndex;//否则就是minIndex==maxIndex-1原创 2015-05-07 22:16:14 · 663 阅读 · 0 评论 -
分层遍历二叉树
题目:问题一: 给定一颗二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层将单独输出一行),每一层要求访问的顺序为从左到右,并将节点依次编号。那么分层遍历如图3-17中的二叉树,正确输出应为:1,2,34,5,67,8问题二: 写另外一个函数,打印二叉树中的某层次的节点(从左到右),其中根节点为第0层,函数原型为int原创 2015-05-07 20:54:53 · 764 阅读 · 0 评论 -
重建二叉树
二叉树的结点表示:struct NODE{ NODE* pLeft; NODE* pRight; char chValue;};假设已经有了前序和中序遍历结果,希望通过一个算法重建这颗树。分析://Rebuild.cpp :根据前序及中序结果,重建树的根节点//定义树的长度,为了后序调用实现的简单,直接用宏定义了原创 2015-05-07 21:16:08 · 447 阅读 · 0 评论 -
金刚坐飞机问题
问题一的解法:问题二的解法:回顾:原创 2015-05-08 21:30:32 · 654 阅读 · 0 评论 -
数组分割
题目描述: 有一个没有排序,元素个数为2n的正整数数组,要求:如何能把这个数组分割为元素个数为n的两个数组,并使两个子数组的和最接近。 分析: 题目的本质就是要从2n个整数中找出n个,使得它们的和尽可能地靠近所有整数之和的一半。解法一和二:伪代码如下:定义:Heap[i]表示存储从arr中取i个数所能原创 2015-04-25 20:50:28 · 763 阅读 · 0 评论 -
寻找数组中的最大值最小值
解法一: 分别求出数组中的最大值和最小值。先扫描一遍数组,找出最大的数和最小的数。需要比较2*N次。解法二: 一般情况下,最大值和最小值不相同。所以把数组分成两部分,然后再从这两部分中分别找出最大值和最小值。 最后,从奇偶数位上分别求出Max=9,Min=3,各需要比较N/2次,整个算法共需要比较1.5*N次。解法三:原创 2015-04-22 20:12:09 · 1531 阅读 · 0 评论 -
寻找最近点对
解法一: 数组中总共包含N个数,把它们的两两差值求出来,就可以得到最小值对。时间复杂度为O(N2).N2值N的平方代码如下:double MinDifference(double arr[], int n){if (n return 0;double fMinDiff = fabs(arr[0] - arr[1]);for (int i = 0; i原创 2015-04-22 21:17:22 · 590 阅读 · 0 评论 -
快速寻找满足条件的两个数
题目: 能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的数字。解法一: 穷举法,从数组中任意取出两个数字。计算两者之和是否为给定的数字。其时间复杂度为N(N-1)/2,即O(N2).解法二:解法三: 直接对两个数字的和进行一个有序的遍历,从而降低算法的时间复杂度。 首先对数组进行排序,时间原创 2015-04-22 22:05:48 · 625 阅读 · 1 评论 -
寻找发帖“水王”
题目描述: “水王”指发帖(和回帖)数超过贴子总数的一半。快速找出这个“水王”的算法解法一和解法二:解法三: 避免排序的方法,如果每次删除不同的ID,那么,在剩下的ID列表中,"水王"ID出现的次数仍然超过总数的一半。总的时间复杂度为O(n)。且只需要常数的额外内存。Type Find(Type* ID,int N){ Type can原创 2015-04-19 19:08:49 · 314 阅读 · 0 评论 -
统计1的个数
题目描述: 给定一个十进制数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。例如:N=2;写下1,2。这样只出现了1个“1”N=12;我们会写下1,2,3,4,5,6,7,8,9,10,11,12.这样,1的个数为5问题:1.写一个函数f(N),返回1到N之间出现的“1”的个数。2.在32位整数范围内,满足条件”f(N)=N"原创 2015-04-19 19:28:06 · 500 阅读 · 0 评论 -
子数组的最大乘积
题目: 给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度。解法一:解法二:原创 2015-04-23 20:23:08 · 482 阅读 · 0 评论 -
子数组之和的最大值(二维)
解法一: 最直接的方法,枚举一个矩形区域,然后再求这个矩形区域中元素的和。int max(int x, int y){return (x > y) ? x : y;}//@parameters//n,行数//m,列数int MaxSum(int *A, int n, int m){maximum = -INF;for (i_min = 1;原创 2015-04-23 21:58:47 · 509 阅读 · 0 评论 -
求数组的子数组之和的最大值
解法一:先明确题意: 1.题目说的子数组,是连续的。 2.题目只需要求和,并不需要返回子数组的具体位置。 3.数组的元素是整数,所以数组可能只包含有正整数,零,负整数。举几个例子:数组:[1,-2,3,5,-3,2]应返回8.数组:[0,-2,3,5,-1,2]应返回9。数组:[-9,-2,-3,-5,-3]应返回-2。最直接的方法:原创 2015-04-23 20:35:12 · 454 阅读 · 0 评论 -
最大公约数问题
解法一: 辗转相除法,使用原理为f(x,y)表示x,y的最大公约数,取k=x/y,b=x%y,则x=ky+b,如果一个数能够同时整除x和y,则必能同时整除b和y,而能够同时整除b和y的数也必能同时整除x和y,即x和y的公约数与b和y的公约数相同的,其最大公约数也是相同的,则有f(x,y)=f(y,x%y)(y>0).具体代码如下:int gcd(int x,int y){原创 2015-04-20 20:09:53 · 596 阅读 · 0 评论 -
找符合条件的整数
题目: 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式只含有1和0 。分析: 将问题“求一个最小的正整数M,使得N*M的十进制表示形式里只含有1和0”转换为求一个最小的正整数X,使得X的十进制表示形式里只含有1和0,并且X被N整除。原创 2015-04-20 21:23:18 · 796 阅读 · 0 评论 -
求数组中最长递增子序列
题目描述: 求一个一维数组(N个元素)中的最长递增子序列的长度。例如:在序列1,-1,2,-3,4,-5,6 ,-7中,其最长的递增子序列为1,2,4,6分析:解法一:无houxiao原创 2015-04-24 20:14:45 · 672 阅读 · 0 评论 -
数组循环移位
题目描述: 设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。解法一: 可以每次将数组中的元素右移一位,循环K次。abcd1234-->4abcd123-->34abcd12-->234abcd1-->1234abcd.伪代码如下:RightShift(int *arr, int N, int K)原创 2015-04-24 21:30:23 · 591 阅读 · 0 评论 -
斐波那契数列--之优化(Fibonacci)
斐波那契数列由如下递推关系式定义:代码如下:int Fibonacci(int n){ if(n<=0) return 0; else if(n==1) return 1; else return Fibonacci(n-1)+Fibonacci(n-2);}解法一:递推关系的优化解法二:求解通项公式 解原创 2015-04-20 21:39:11 · 494 阅读 · 0 评论 -
区间重合判断
题目描述:给定一个源区间,原创 2015-04-26 19:58:24 · 372 阅读 · 0 评论 -
寻找最大的K个数
解法一: 利用快速排序的思想,假设N个数存储在数组S中,我们从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb,Sa中的元素大于等于X,Sb中的元素小于X。伪代码如下:Kbig(S,k) if(k if (length S return S(Sa,Sb)=Partition(S)return Kbig(S原创 2015-04-19 20:47:38 · 504 阅读 · 0 评论