《编程之美》
chensilly8888
求饥若渴,大智若愚。
展开
-
《编程之美》学习笔记——2.4 1的数目
一、问题(细节阅读《编程之美》): 给定一个十进制正整数N,统计从1开始,到N(含N)的所有整数中出现的所有“1”(包含各个位)的个数。原创 2014-12-28 13:53:35 · 614 阅读 · 0 评论 -
《编程之美》学习笔记——2.21只考加法的面试题
一、问题我们知道:1 + 2 = 3;4 + 5 = 9;2 + 3 + 4 = 9;等式两边都是两个以上的连续的自然数相加,那么是不是所有的整数都可以写成这样的形式呢?稍微考虑一下,我们发现,4、8等数并不能写成这样的形式。问题1:写一个程序,对于一个64位正整数,输出它所有可能的连续自然数(两个以上)之和的算式。问题分析:输入:Sum(64位正整数),可转化为:原创 2015-01-26 14:05:11 · 940 阅读 · 0 评论 -
《编程之美》学习笔记——2.13子数组的最大乘积
一、问题 给定一个长度为N的整数数组,只允许使用乘法,不能用除法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度。分析:输入:长度为N的整数数组array。输出:这里输出两个值,(N-1)个数的组合最大乘积multiple,以及剔除的数在数组中的索引index_delete。约束:不能用除法计算。二、解法 解法一 暴力求解法原创 2015-02-18 00:02:52 · 586 阅读 · 0 评论 -
《编程之美》学习笔记——2.11寻找最近点对
一、问题给定平面上N个点的坐标,找出距离最近的两个点。分析:输入:N个点,即N组坐标(N >= 2),每个坐标可以用数据结构Point结构体来表示,存储x和y坐标。输出:两个点,即2组坐标。约束:输出的两个点在输入所有的点中距离最近。附加:可以把最小距离值也作为一个输出。思考:可以先考虑一维情况下问题的解,在拓展处理二维情况(平面)。二、一维解法我们原创 2015-02-15 18:53:13 · 770 阅读 · 0 评论 -
《编程之美》学习笔记——2.17数组循环移位
一、问题设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。问题分析: 输入:长度为N的原数组,K 输出:循环右移K位后的数组 约束:时间复杂度要求O(N),且只允许两个附加变量二、解法 版本一:数组中的每个元素一次移到位(利用数据移位的变化规律) 思考:既然时间复杂度要求时O(n),且只允许两个附加变量,原创 2015-01-13 15:57:37 · 845 阅读 · 0 评论 -
《编程之美》学习笔记——2.19区间重合判断
一、问题 给定一个源区间[x,y](y>=x)和N个无序的目标区间[x1,y1],[x2,y2],...,[xn,yn],判断源区间[x,y]是不是在目标区间内。例: 给定源区间[1 6]和一组无须的目标区间[2 3][1 2][3 9],即可认为区间[1 6]在区间[2 3][1 2][3 9]内(因为目标区间实际上时[1,9])。问题分析: 输入:源区间[x,y],可原创 2015-02-03 15:23:10 · 795 阅读 · 0 评论 -
《编程之美》学习笔记——2.10寻找数组中的最大值和最小值
一、问题对于一个由N个整数组成的数组,需要比较多少次才能把最大值和最小值的数找出来呢?问题分析:输入:一个有限长度且为N的数组。输出:该数组的最大值max和最小值min。特点:最大值和最小值都要找到,可以考虑它们之间的关系;这个问题在《编程之美》中侧重解决尽可能减少算法内部比较次数的这个问题。结合学习:《算法导论》(第九章 中位数和顺序统计量 第一节 最小值和最大值) 文章给出了更精确的比较次数,因为这里给出了精确的比较次数(与数组长度奇数偶数相关),《编程之美》中的数据都是假设数组原创 2015-01-13 09:20:41 · 886 阅读 · 0 评论 -
《编程之美》学习笔记——2.6精确表达浮点数
一、问题 在计算机中,使用float或者double来存储小数是不能得到精确值的。如果你希望得到精确计算结果,最好是用分数形式来表示小数。有限小数或者无限循环小数都可以转化为分数。比如: 0.9 = 9/10 0.333(3)= 1/3(括号中的数字表示是循环节) 当然一个小数可以用好几种分数形式来表示。如: 0.333(3)= 1/3 = 3/9原创 2015-01-18 15:12:53 · 883 阅读 · 0 评论 -
《编程之美》学习笔记——2.2不要被阶乘吓倒
一、问题 1、给定一个整数N,那么N的阶乘N!末尾有多少个0? 例子:10!=3 628 800,则 N!的末尾有两个0。 2、求N!的二进制表示中最低位1的位置。二、问题1解法 版本一:(自己思考的方案)数学规律解法 首先,我们可以考虑的数学规律上去寻找末尾0的个数:对于个位数之间相乘能够给出0结尾的乘法有:5*(2/4/6/8),而二位数中10 = 2原创 2015-01-11 20:39:16 · 589 阅读 · 0 评论 -
《编程之美》学习笔记——2.3寻找发贴“水王”
一、问题 Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?问题分析: 输入:给入一个含有重复数据的ID数组 输出:重复次数最高的ID 约束:重复次数最高的ID个数超过总数的一半。原创 2015-01-12 11:21:58 · 596 阅读 · 0 评论 -
《编程之美》学习笔记——2.1求二进制中1的个数
一、题目: 求二进制中1的个数。对于一个字节(8bit)的无符号整型变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能的高。二、解法: 版本一(除法):最简单的思路,利用求余算法统计1的个数。 9 #include 10 #include 11 12 typedef unsigned char TYPE; 13 TYPE N = 234;原创 2014-12-28 20:38:17 · 979 阅读 · 0 评论 -
《编程之美》学习笔记——2.7最大公约数问题
一、问题 求两个正整数的最大公约数。如果两个正整数都很大,有什么简单的算法吗?问题分析:什么是最大公约数? (参考维基百科:http://en.wikipedia.org/wiki/Greatest_common_divisor)最大公约数:Greatest Common Divisor (GCD); greatest common factor (gcf);highest原创 2015-01-14 19:45:07 · 985 阅读 · 0 评论 -
《编程之美》学习笔记——2.5寻找最大的K个数
一、问题 有很多无序的数,假定它们各不相等,从中找出最大的K个数。问题分析: 输入:N个数;K。 输出:N个数中最大的K个数,这K个数并不需要是有序的,只需为数组中最大的K个数即可。二、解法 解法一 排序算法数组全部数排序:可以对数组进行快速排序(O(nlgn)),然后获得最大的K个数(O(k))。这种方法下总的时间复杂度O(nlgn + k)=O(原创 2015-02-04 13:27:21 · 616 阅读 · 0 评论