
编程之美
It_Ds_N_cpp
这个作者很懒,什么都没留下…
展开
-
1.1 让CPU占用率曲线听你指挥
(一)让CPU的占有率曲线呈现在50%。(1)第一种方法:假设代码要运行的CPU是P4 2.4Ghz(2.4 * 10 的9次方个时钟周期每秒)。现代CPU每个时钟周期可以执行两条以上的代码,我们取平均值两条,于是有:(2400000000 * 2) / 5 = 960000000(循环 / 秒),也就是说CPU 1秒钟可以运行这个空循环960000000次。不过我们不能简原创 2014-09-26 16:55:38 · 704 阅读 · 0 评论 -
2.15 子数组之和的最大值(二维)
题目:给定一个二维数组,求这个二维数组的子数组之和的最大值。分析:将二维降低到一维的情况。代码:#include const int MAXN = 10000;const int INF = 100000000;using namespace std;int B[MAXN][MAXN], PS[MAXN][MAXN];int n, m;int B原创 2015-01-25 11:33:12 · 676 阅读 · 0 评论 -
2.17 数组循环移位
题目:把一个含有N个元素的字符串右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。例子:字符串为:abcd1234,右移4位,结果变为:1234abcd思路:移动前跟移动后是有两段的顺序是不变的,所以可以把这两段看成两个整体右移K位的过程就是把数组的两部分交换一下。交换的过程:(1)逆序排列第一部分(2)逆序排列第二部分(3)再全部逆序!原创 2015-01-25 18:13:45 · 639 阅读 · 0 评论 -
2.16 求数组中最长递增子序列
题目:求一个一维数组(N个元素)中最长递增子序列的长度DP题代码如下:#include using namespace std;const int MAXN = 100000;const int INF = 10000000;int minV[MAXN], lis[MAXN], Array[MAXN];int n;//lis[i]表示从第i个元素开原创 2015-01-25 17:36:49 · 728 阅读 · 0 评论 -
2.19 区间重合判断
问题:1. 给定一个源区间[x,y]和N个无序的目标区间[x1,y1] [x2,y2] ... [xn,yn],判断源区间[x,y]是不是在目标区间内。2. 给定一个窗口区域和系统界面上的N个窗口,判断这个窗口区域是否被已有的窗口覆盖。1. 解法:先用区间的左边界值对目标区间进行排序O(nlogn),对排好序的区间进行合并O(n),对每次待查找的源区间,原创 2015-04-20 20:25:26 · 572 阅读 · 0 评论 -
3.1 字符串移位包含的问题
题目:给定两个字符串s1,s2,要求判定s2是否可以被s1循环移位后得到的字符串包含。思路:首先如果第一个字符串的长度比第二个更短的话,那么直接错误,没有比较的意义了。 然后,因为循环移位的原因,如果s2可以被s1循环移位后的结果所包含,那么肯定可以被s1s1所包含。#include #include #include #define MAXN 1000using na原创 2015-04-20 21:12:46 · 695 阅读 · 0 评论 -
3.2 电话号码对应英语单词
原始问题如下:手机上面的数字键均对应了几个字符,譬如2对应了a,b,c。问题是当输入一段数字后,求出所有可能的字符组合第一种方法:假设电话号码是n个数字,那么就n个for循环。这方法果断不好第二个方法:#include #include using namespace std;char c[10][10] ={ "", "", "原创 2015-04-21 10:03:02 · 804 阅读 · 0 评论 -
4.7 蚂蚁爬杆
题目:有一根树枝,树枝很细,不能同时通过两只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。 当两只蚂蚁碰头时,它们会同时调头朝反方向走。 求所有蚂蚁都离开木杆的最短时间和最长时间。思想:虽然两只蚂蚁相遇后是调头往反方向走,但是,可以“看作”两个蚂蚁相遇后,擦身而过。 也就是说,可以认为蚂蚁的运动是独立的,是否碰头并不是重点。原创 2015-05-09 11:10:37 · 997 阅读 · 0 评论 -
4.4 点是否在三角形内
题目:给定一个三角形和一个点,判断这个点是否在三角形内。。第一种方法:面积相等法 如果点在三角形内部,则如果将三角形的三个顶点与这个点相连所得的三个小三角形的面积之和与原三角形的面积相等S(A,B,D) + S(A,C,D) + S(B,C,D) = S(A,B,C)第二种方法:向量叉积法 判断点P3是否在向向P1P2的左边,只需要通过两个向量P1P2、原创 2015-05-09 10:45:57 · 736 阅读 · 0 评论 -
3.4 从无头单链表中删除节点
题目:有一个单链表,没有头指针,现在有一个指针指向这个链表的中间的一个节点,要求删除这个节点。方法:由于没有办法寻求指针去找到要删除的这个节点的前一个节点。 所以要另想办法。 设立新的指针指向要删除的节点的后一个节点,然后把这两个节点里面的数据换一下!然后删除要删除节点的后一个节点! 这样 就ok了!代码:void DeleteRan原创 2015-05-04 20:29:40 · 641 阅读 · 0 评论 -
3.3 计算字符串的相似度
题目:定义一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把“a”替换为“b”); 2.增加一个字符(如把“abdd”变为“aebdd”); 3.删除一个字符(如把“travelling”变为“traveling”); 给定任意两个字符串,你是否能写出一个算法来计算它们的距离呢?方法:原创 2015-05-04 19:13:49 · 583 阅读 · 0 评论 -
3.6 编程判断两个链表是否相交
(一)题目:输入一个单项链表,找出该链表的倒数第k个节点。 解法:设立两个指针,先让第一个指针先往前走k步,然后第二个指针放到链表开头。 然后两个链表一起往后走,当第一个链表到达链表尾部的时候,后面那个链表所在的位置就刚好是链表的倒数第k个节点! 代码: struct node { int data; node *pNext;};node原创 2015-05-05 13:59:15 · 545 阅读 · 0 评论 -
3.5 最短摘要的声成
题目:Alibaba笔试题:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法String extractSummary(String description,String[] key words),目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。(不限编程语原创 2015-05-05 11:07:23 · 613 阅读 · 0 评论 -
3.8 求二叉树中节点的最大距离
题目:把二叉树看成一个图,父子节点之间的连线看成是双向的,定义“距离”为两个节点之间的边数。求一颗二叉树中的两个节点之间的距离的最大值。方法一:用书上写的方法:代码:struct node { node *left; node *right; int nMaxLeft; int nMaxRight; cha原创 2015-05-06 22:16:33 · 687 阅读 · 0 评论 -
3.7 队列中取最大值操作问题
问题:假设有这样一个拥有3个操作的队列:1. EnQueue(v): 将v加入队列中2. DeQueue(): 使队列中的队首元素删除并返回此元素3. MaxElement: 返回队列中的最大元素设计一种数据结构和算法,让MaxElement操作的时间复杂度尽可能地低。方法:用两个栈来模拟队列在代码中,maxStackItemIndex代表栈中dui原创 2015-05-06 18:04:44 · 828 阅读 · 0 评论 -
3.10 分层遍历二叉树
题目1:写一个函数,打印二叉树中某层次的节点(从左到右),其中根节点为第0层。思路:利用递归算法,思想是:要求访问二叉树中第k层的节点,那么其实就是要访问“以该二叉树根节点的左右子节点为根节点的两颗子树”中层次为k-1的节点代码:struct pNode { int data; pNode *lChild; pNode *rChild;};int原创 2015-05-07 11:48:36 · 552 阅读 · 0 评论 -
2.14 求数组的子数组之和的最大值
题目:给定一个一维数组,求这个数组的子数组之和的最大值。最佳方法:动态规划!一、可以将一个大问题(N个元素数组)转化为一个较小的问题(N-1个元素数组)。。假设已经知道(A[1],...A[n-1])中最大的子数组的和为:All[1]并且已经知道(A[1],...A[n-1])中包括A[1]的子数组的最大和为start[1]所以最终的解All[0]原创 2015-01-25 11:29:54 · 736 阅读 · 0 评论 -
2.12 快速寻找满足条件的两个数
题目:一个数组,快速找出两个数的和,使得这个和等于给定的另外一个数思路:先排序,然后首尾两个指针,i.j,如果和等于给定的数,则找到,如果小于的话,则I++,如果大于的话,则J--代码:#include #include #define MAXN 10000using namespace std;int n, sum;int a[MAXN];int main原创 2015-01-18 12:04:23 · 710 阅读 · 0 评论 -
1.2中国象棋将帅问题
(根据中国象棋的基本原则)在只有双的将帅棋盘上,找出所有双方可以落子的位置(将帅不能碰面),但只能使用一个变量。直觉上我们想到,只要遍历将帅所有可能的位置,去除将帅冲突的位置即可。可见,剩下的问题就在于如何使用一个变量来做二重循环的遍历。书中解法一给出的方法是将一个Byte变量拆成两个用,前一半代表“帅”可以走的位置,后一个变量代表“将”可以走的位置(事先已经将“将”和“帅”可以走的3*3的位原创 2014-09-27 21:38:49 · 840 阅读 · 0 评论 -
1.6 饮料供货
问题:总共n中饮料,每种饮料表示为(S[i],V[i],C[i],H[i],B[i]),S表示名称,V表示容量,C表示可以买的最大数量,H表示满意度,B表示实际购买量在V[i]*B[i]求和=V的情况下,H[i]*B[i]求和最大化最优化,毫无疑问,考虑动态规划跟贪心。状态转移方程:设Opt(V’,i)表示从 i 到 n-1 种饮料中,Ci 为第i种饮料可能的最原创 2014-10-07 11:33:47 · 860 阅读 · 0 评论 -
1.8 小飞的电梯调度算法
题目:有一栋楼,现在设计一种电梯调度算法:电梯在一楼让大家上电梯,然后根据大家选择要到的楼层算出某一楼层i,电梯在i层停下让所有人下电梯,然后大家爬楼梯达到自己的楼层。请问电梯停在哪一层,可以使得这一次的所有乘客爬楼层之和最短?(一)最直接最简单的方法就是直接枚举从第一层到最后一层,然后算出电梯停在哪一层会使得所有乘客爬楼层之和最短。代码如下:int nPerson[]; //n原创 2014-10-07 17:08:50 · 1467 阅读 · 0 评论 -
1.9 高效率的安排见面会
题目:一天中,要进行N个面试,它们的时间分别为[B[i], E[i]],分别表示面试的开始时间跟面试的结束时间。这N个面试安排在若干个面试点进行,不同的面试在同一个时间不能被安排在同一个面试点。现在要求出至少需要多少个面试点。分析思路:通过贪心算法来解决,算法的思路是:对于所有的面试I[i] = [B[i], E[i]],按B[i]从小到大排序,然后按顺序对各个区间着色。原创 2014-10-08 14:17:23 · 976 阅读 · 0 评论 -
1.10 双线程高效下载
(一)题目 网络上下载数据,然后存储到硬盘上。简单做法是:先下载一块然后写到硬盘,然后再下载,再写到硬盘上。 缺点:需要先下载完才能写入硬盘,下载和写是串行操作。 改进:让两个线程并行进行,设置缓冲区,采用信号量的形式。 下载线程,只要缓冲区有空余就下载,下载完成之后告诉写线程缓冲区有数原创 2014-10-08 21:14:20 · 682 阅读 · 0 评论 -
1.3一摞烙饼的问题
题目是这样的:星期五的晚上,一帮同事在希格玛大厦附近的“硬盘酒吧”多喝了几杯。程序员多喝了几杯之后谈什么呢?自然是算法问题。有个同事说:“我以前在餐馆打工,顾客经常点非常多的烙饼。店里的饼大小不一,我习惯在到达顾客饭桌前,把一摞饼按照大小次序摆好——小的在上面,大的在下面。由于我一只手托着盘子,只好用另一只手,一次抓住最上面的几块饼,把它们上下颠倒个个儿,反复几次之后,这摞烙饼就排好序原创 2014-09-29 18:18:52 · 1020 阅读 · 0 评论 -
1.5 快速找出机器故障
题目:假设一个机器只存储一个标号为ID的记录,假设每份数据保存2个备份,这样就有2个机器存储了相同的数据。其中ID是小于10亿的整数。问题1、在某个时间,如果得到一个数据文件ID的列表。是否能够快速的找到这个表中仅出现一次的ID?即快速找出出现故障的机器存储的数据ID。问题2、如果有两台机器死机呢?(假设同一个数据的俩个备份不会同时丢失,即列表中缺少的是两个不等的ID)扩展原创 2014-09-30 20:41:27 · 773 阅读 · 0 评论 -
1.16 24点游戏
问题:给玩家4张牌,每张牌的面值在1-13之间,允许其中有数值相同的牌,采用加、减、乘、除四则运算,允许中间运算存在小数,并且可以使用括号,但每张牌只能用一次。构造表达式,使其结果为24.解法一:利用递归,强搜!代码如下:#include #include #include using namespace std;const double Threshold = 1原创 2014-10-28 20:46:58 · 627 阅读 · 0 评论 -
1.15 构造数独
(一)用回溯法构造数独#include #include #include #include #include using namespace std;int sudu[9][9];void sudu_print(int sudu[][9]) { for(int i = 0; i < 9; ++i) { for(int j =原创 2014-10-17 15:43:06 · 802 阅读 · 0 评论 -
2.2 不要被阶乘吓倒
问题描述1、给定一个整数N,阶乘N!末尾有多少个02、求N!的二进制表示中最低位1的位置1、给定一个整数N,阶乘N!末尾有多少个0举例:10!=3 628 800,则 N!的末尾有两个0思路: 即,知道 Z ,就知道N!中含有0的个数方法一:求出1~N中每一个数被5整除的因子的个数,比较笨代码:int FindZero原创 2014-11-30 16:10:51 · 497 阅读 · 0 评论 -
2.1 求二进制中1的个数
int Count(BYTE v) { int num = 0; while(v) { v &= (v-1); num++; } return num;}原创 2014-11-29 22:10:08 · 470 阅读 · 0 评论 -
2.3 寻找发帖水王
问题描述:Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?思路,遍历一遍,只要遇原创 2014-12-03 21:25:37 · 540 阅读 · 0 评论 -
2.4 1的数目
题目: 写一个函数f(n),返回1到N之间出现的“1”的个数。从特殊情况推导到一般情况。分为该位数是0、1、其他。。(1)如果这位上的数字是0的话,那么这个位上出现1的次数仅有更高位决定。(2)如果这位上的数字是1的话,那么这个位上出现的1的次数不仅跟更高位有关,还跟更低位有关。· (3)如果这位上的数字是其他(2-9)的话,那么这个位上出现1的次数仅由更高位决定。原创 2014-12-07 20:40:08 · 593 阅读 · 0 评论 -
2.5 求TOP K
求一个数组里面的最大的K个数。。TOPK问题。。#include #include #include #define MAXN 10000using namespace std;int a[MAXN], n, k;void findKTops(int *a, int k, int n) { make_heap(a, a+k, greater());原创 2015-01-11 22:35:04 · 467 阅读 · 0 评论 -
2.13 子数组的最大乘积
题目:给定一个长度为N的整形数组,只允许用乘法,不能用除法。计算任意N-1个数的组合中乘积最大的一组。方法一:#include #define MAXN 10000using namespace std;int n, a[MAXN], s[MAXN], t[MAXN], p[MAXN];//s[i]表示数组前i个元素的乘积//t[i]表示数组后N-i个元素的乘原创 2015-01-18 21:18:47 · 771 阅读 · 1 评论 -
3.9 重建二叉树
题目:给定一颗树的先序遍历结果和中序遍历的结果,重建这颗树。例如:前序:a b d c e f中序:d b a e c fa是根节点。思路:根据前序,可以很快找出根节点a,然后根据中序,可以找出根节点a的左右子树,然后递归求a的左子树前序b d跟中序d b,a的右子树前序c e f跟中序e c f即可代码:struct pNode原创 2015-05-07 11:05:58 · 569 阅读 · 0 评论