上一页 1 2 3 4 5 6 7 8 9 ··· 13 下一页
摘要: 1. 简述 写一个程序,求两个正整数的最大公约数。如果两个正整数很大,有什么简单的方法吗?2. 思路 这个书上总结的很全了已经。辗转相除法,设f(x,y)表示x与y的最大公因子,如果x=y*k+z,z>0,那么f(x,y)=f(y,z),如果x=y*k+z,z=0,那么f(x,y)=y,即此时x可以整除y。比如f(6,4)=f(4,2)=2,f(24,18)=f(18,6)=6。 改进方法,当正整数很大的时候,大数除法比较消耗时间,这里规避大数的除法运算。每次调整x,y保证x>=y,然后分情况讨论: 当y=0时,f(x,y)=x。即x就是上一步可以被整除的因子。 当x%2=0且y% 阅读全文
posted @ 2011-09-25 17:40 xiaodongrush 阅读(309) 评论(0) 推荐(0) 编辑
摘要: 1. 简述 简单的说就是将有限循环小数和无限循环小数转化为分数形式。比如: 0.9 = 9/10 0.333(3) = 1/3,其中括号表示循环节。2. 思路 书上的方法就是分情况讨论。 首先是有限循环小数,比如123.456,整数部分123不用说了,主要是小数部分0.456,直接转化为456/1000,然后消去最大公因子即可。其次是无限循环小数,比如123.4(56),整数部分123同样不用解决,主要是循环小数部分0.4(56),首先把小数部分拆为非循环和循环两个部分,注意非循环部分比如在循环部分之前(这个很显然),即0.4 + 0.0(56),其中非循环部分0.4直接转化为4/10,0.0 阅读全文
posted @ 2011-09-25 17:21 xiaodongrush 阅读(359) 评论(0) 推荐(0) 编辑
摘要: 1. 简述 简单的说就是有很多很多数值,多到内存放不下,要求选取其中最大的若干个数值。2. 原理 赤裸裸的TOP-K问题,比如求前100大的数值,维护一个100大小的最小堆,首先读100个元素,初始化这个最小堆,然后,每读取一个数值,根堆的数值比较一下,如果当前数值小于等于堆顶数值,那么继续遍历好了,如果当前数值大于堆顶数值,那么将对堆顶元素改为当前数值,然后更新一下堆,接着继续遍历就好了。另外也可以维护一个100个元素长度的有序数组,每次就是二分插入法。复杂度一般就是N*log100 一般就是这样了,编程之美中的第五个解法也就是应用计数排序的方法,对于一般的数值型还是不错的,可以达到O(N) 阅读全文
posted @ 2011-09-25 17:00 xiaodongrush 阅读(518) 评论(0) 推荐(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'的个数,比如f(12)=5。 2. 满足条件f(N)=N的最大的N是多少?2. 思路数论的题目没有兴趣,也没有思路,直接上书上和别人的思路了。第一个问题的思路是把分别计算第i位上1的个数(其中,i=1,2,...,N的最高位),假设N=A* 阅读全文
posted @ 2011-09-25 16:36 xiaodongrush 阅读(623) 评论(1) 推荐(0) 编辑
摘要: 1. 简述 原题:简略的说,就是一个ID列表,其中每个ID都可能重复出现,其中一个ID的重复出现个数超过了列表长度的一半。要求快速找到这个ID。 扩展:ID列表中,有三个ID,这三个ID重复出现的次数,都超过了列表长度的1/4。要求快速找到这个ID。2. 思路 原题的思路还是编程之美上面的方法,扩展题目的方法是参考中的一篇文章中讲过。 原题的思路是保存一个ID和该ID的计数,然后遍历ID列表,如果当前没有保存的ID(即ID对应次数为0),那么保存遇到的ID,并且计数设置为1;如果遇到的ID刚好是保存的ID,那么计数加1;如果遇到的ID是一个新的ID,那么ID的计数减1。这样遍历之后,保存的ID 阅读全文
posted @ 2011-09-24 22:56 xiaodongrush 阅读(520) 评论(0) 推荐(0) 编辑
摘要: 1. 简述 1) 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0。 2) 求N!的二进制表示中最低位1的位置。2. 思路方法一,求出N!,对于第一个题目,记录其0的个数即可,时间复杂度=O(N)+O(N!中0的个数);对于第二个题目,记录二进制中最低位1右边0的个数即可,时间复杂度=O(N)+O(N!中最低位右边0的个数)。这个方法时间复杂度问题不大,不过空间有问题,因为N!增长太快了,N不用很大,N!很容易就溢出了。方法二,不求N!,从N!的因子入手,第一个题目是计算N!中,因子5的个数,因为每个0都是一个10,10=2*5,因 阅读全文
posted @ 2011-09-24 17:49 xiaodongrush 阅读(727) 评论(0) 推荐(0) 编辑
摘要: 1. 简述 对一个字节(8bit)的无符号整型变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能的高。2. 思路 我对这道题没有什么新的发现,也就是再说一遍编程之美上面的解答思路。第一个思路就是一个位一个位的判断,8位的数字,就是8次。第二个思路就是每次消减数字二进制中的最后一个1,直到数字变为0为止,这个方法仅与数字的二进制中的1的个数有关,因此比第一个思路的复杂度更好一点,每次消减最后一个1的方法为num = num & (num-1)。3. 代码#include <iostream>using namespace std;unsigned char find 阅读全文
posted @ 2011-09-23 16:51 xiaodongrush 阅读(986) 评论(1) 推荐(0) 编辑
摘要: 1. 简述 问题一:给定一棵二叉树,要求按分层遍历该二叉树,即从上到下的层次访问该二叉树(每一层将单独输出一行),每一层要求访问的顺序为从左到右,并将节点依次编号。 问题二:写一个函数,打印二叉树中某层次的节点(从左到右),其中根节点为第0层,函数原型为int PrintNodeAtLevel(Node* root, int level),成功返回1,失败返回0。2. 思路 使用队列进行广度优先搜索,主要有一个特点,即如果第k层元素一个都没出队,那么队列中必然没有k+1层元素,而且如果第k层元素刚好都出队了,队列中只有第k+1层元素,且包含所有的k+1层元素。所以从第一层开始,把根节点入队,记 阅读全文
posted @ 2011-09-11 15:05 xiaodongrush 阅读(1506) 评论(0) 推荐(0) 编辑
摘要: 1. 简述 给定一棵二叉树,假定每个节点都用唯一的字符表示,具体结构如下:structNODE{NODE*pLeft;NODE*pRight;charchValue;}; 假设已经有了前序遍历和中序遍历结果,希望通过一个算法重建这棵树。 给定函数的定义如下:voidRebuild(char*pPreOrder,char*pInOrder,intnTreeLen,NODE**pRoot);参数pPreOrder:前序遍历结果的字符串数组。 pInOrder: 中序遍历结果的字符串数组。 nTreeLen: 树的长度。 pRoot:根据前序和中序遍历结果重新构建树的根节点。 例如 前序遍历结果:a 阅读全文
posted @ 2011-09-11 09:16 xiaodongrush 阅读(394) 评论(0) 推荐(0) 编辑
摘要: 1. 简述 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义“距离”为两个节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。2. 思路 这道题是寻找最大一个距离,还是相对容易的,递归是比较好像到的。对于每个子树来说,要么最大距离在根的左子树中,要么在根的右子树中,要么是通过根的情况。 Height(NULL) = 0, Height(node) = Max{Height(node->left)+1,Height(node->right)+1}。 Max(NULL) = 0; Max(node) = Max{Max(node->le 阅读全文
posted @ 2011-09-10 11:55 xiaodongrush 阅读(346) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 9 ··· 13 下一页