1.5-编程之美
fei20121106
这个作者很懒,什么都没留下…
展开
-
(1.5.2.3)编程之美 寻找发帖水王 扩展问题
编程之美中的“寻找发帖水王”描述的是这么一个问题,有一个ID列表,其中有一个ID(水王的ID)出现的次数超过了一半,请找出这个ID。书中的思路是每次从列表中删除两个不同的ID,不影响“水王的ID在剩余ID中仍然超过一半”这一事实,因此每次删除两个不同的ID,直到剩下的所有ID都相同,那么剩下的就是水王的ID。具体编程的时候,使用一个candidate记录当前猜测的水王ID,转载 2015-04-18 20:17:15 · 1088 阅读 · 0 评论 -
(1.5.2.12)字符串循环移位 编程之美3.1
http://blog.sina.com.cn/s/blog_7d6898410101a66e.htmlhttp://www.cnblogs.com/kevinLee-xjtu/archive/2011/12/14/2299087.html给定两个字符串s1和s2,要求判定s2能否能被s1做循环移位得到的字符串包含。例如,s1=AABCD,s2=CDAA,返回t转载 2015-10-12 16:27:08 · 643 阅读 · 0 评论 -
(1.5.2.0)编程之美思路总结
数学类零编程之美 set 0 求二进制数中1的个数一编程之美 set 1 不要被阶乘吓倒二编程之美 set 2 精确表达浮点数三编程之美 set 3 最大公约数问题四编程之美 set 4 找到符合条件的数五编程之美 set 5 寻找数组中最大值和最小值六编程之美 set 6 寻找最近点对七编程之美 set 7 求数组中的最长递增子序列八编程之美 set 8 区间重合判断九编程之美原创 2015-07-20 18:48:39 · 1285 阅读 · 0 评论 -
(1.5.2.10)寻找最近点对
题目:平面中有若干个点,寻找距离最近的两个点。分析:方法1:两两点比较,寻找最近的两个点对,复杂度O(N^2),优点代码简单不容易出错方法2:观察两两比较的方法,发现有很多无用的比较,对于每一个点只要计算到它最近的点的距离就可以了,枚举所有的点,最后得出距离最近的一对点,但对于一个给定的点,如何找到距离它最近的点呢?可以使用一些启发式规则,减少比较的次数,例如:对于(x,y转载 2015-04-21 13:11:01 · 1771 阅读 · 0 评论 -
(1.5.2.2)不要被阶乘吓倒
阶乘(Factorial)是个很有意思的函数,但是不少人都比较怕它,我们来看看两个与阶乘相关的问题:1. 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0。2. 求N!的二进制表示中最低位1的位置。分析与解法有些人碰到这样的题目会想:是不是要完整计算出N!的值?如果溢出怎么办?事实上,如果我们从"哪些数相转载 2015-04-20 15:36:51 · 695 阅读 · 0 评论 -
(1.5.2.11)快速寻找满足条件的两个数
前奏希望此编程艺术系列能给各位带来的是一种方法,一种创造力,一种举一反三的能力。本章依然同第四章一样,选取比较简单的面试题,恭祝各位旅途愉快。同样,有任何问题,欢迎不吝指正。谢谢。第一节、寻找满足条件的两个数第14题(数组):题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字转载 2015-04-21 13:19:52 · 1129 阅读 · 0 评论 -
(1.5.2.9)寻找数组的最大值和最小值
问题描述:给出一个数组,包含N个整数,那么需要比较多少次找到最大值和最小值注意:要想得到最大值和最小值,遍历一遍数组是不可避免的。我们能减少的就是减少比较次数来提高效率方法一、遍历一遍数组,同时得到最大值和最小值具体是,定义一个max 和 min,每遍历一个数,就分别和max 和 min比较一次,直到处理完所有的数据比较次数: N+N = 2N方法二、我们可转载 2015-04-21 12:55:00 · 715 阅读 · 0 评论 -
(1.5.2.8)找出相乘结果只有0和1的整数
题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0.解决这个问题首先考虑对于任意的N,是否这样的M一定存在。可以证明,M是一定存在的,而且不唯一。简单证明:因为 这是一个无穷数列,但是数列中的每一项取值范围都在[0, N-1]之间。所以这个无穷数列中间必定存在循环节。即假设有s,t均是正整数,且s,所以转载 2015-04-21 12:39:17 · 997 阅读 · 0 评论 -
(1.5.2.7)最大公约数
问题:求两个数的最大公约数解法一:欧几里得辗转相除法:f(x,y) = GCD(x,y), 取k = x / y, b = x % y,则:x = k*y + b;如果一个数能整除x,y,则它也能整除b,y; 而且能整除b,y的数必能整除x,y,即x,y和b,y的公约数是相同的,其最大公约数也是相同的,即f(x,y) = f(y ,x % y) (x>=y>0)转载 2015-04-21 12:01:12 · 835 阅读 · 0 评论 -
(1.5.2.6)精准表达浮点数
题目来自编程之美题目:举例:0.3333(3333) = 1/30.285714(285714) = 2/70.3(000) = 3/100.25 = 1/4思路:拿到这样一个问题,我们往往会从最简单的情况入手,因为所有的小数都可以分解成一个整数和一个纯小数之和,不妨只考虑大于0,小于1的纯小数,而且暂转载 2015-04-21 11:52:11 · 848 阅读 · 0 评论 -
(1.5.2.4)编程之美: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转载 2015-04-20 15:52:29 · 633 阅读 · 0 评论 -
(1.5.2.1)求二进制数中1的个数
【解法三】位操作比除、余操作的效率高了很多。但是,即使采用位操作,时间复杂度仍为O(log2v),log2v为二进制数的位数。那么,还能不能再降低一些复杂度呢?如果有办法让算法的复杂度只与"1"的个数有关,复杂度不就能进一步降低了吗?同样用10 100 001来举例。如果只考虑和1的个数相关,那么,我们是否能够在每次判断中,仅与1来进行判断呢?为了简化这个问题,我们考虑只有转载 2015-04-20 15:29:37 · 782 阅读 · 0 评论 -
(1.5.1.2)编程之美:中国象棋将帅问题——一个变量实现多重循环
题目:下过中国象棋的朋友都知道,双方的"将"和"帅"相隔遥远,并且它们不能照面。在象棋残局中,许多高手能利用这一规则走出精妙的杀招。假设棋盘上中只有"将"和"帅"二子(如图1所示,注:此图仅作示意,原图请见《编程之美:微软技术面试心得》一书)(为了下面叙述方便,我们约定用A表示"将",B表示"帅")。A、B二子被限制在已方3×3的格子里运动。例如,在如上的表格里,A被正方形{d10转载 2015-04-20 13:53:47 · 1062 阅读 · 0 评论 -
(1.5.1.3)编程之美:一摞烙饼的排序
问题: 星期五的晚上,一帮同事在希格玛大厦附近的“硬盘酒吧”多喝了几杯。程序员多喝了几杯之后谈什么呢?自然是算法问题。有个同事说:“我以前在餐馆打工,顾客经常点非常多的烙饼。店里的饼大小不一,我习惯在到达顾客饭桌前,把一摞饼按照大小次序摆好——小的在上面,大的在下面。由于我一只手托着盘子,只好用另一只手,一次抓住最上面的几块饼,把它们上下颠倒个个儿,反复几次之后,这摞烙饼就排好序了。我后转载 2015-04-20 14:02:03 · 1075 阅读 · 0 评论 -
(1.5.1.1)编程之美:让CPU占用率曲线听你指挥
题目:写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率。程序越精简越好,计算机语言不限。例如,可以实现下面三种情况:1. CPU的占用率固定在50%,为一条直线;2. CPU的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1~ 100);3. CPU的占用率状态是一个正弦曲线。首先什么是转载 2015-04-20 13:47:25 · 888 阅读 · 1 评论 -
(1.5.2.5)寻找最大的K个数
在面试中,有下面的问答:问:有很多个无序的数,我们姑且假定它们各不相等,怎么选出其中最大的若干个数呢?答:可以这样写:int array[100] ……问:好,如果有更多的元素呢?答:那可以改为:int array[1000] ……问:如果我们有很多元素,例如1亿个浮点数,怎么办?答:个,十,百,千,万……那可以写:float array [100原创 2015-04-20 16:59:40 · 859 阅读 · 0 评论