程序员编程艺术第1~38章集锦与总结,及Github、PDF下载
前言
熟悉本blog的朋友大都知道,在2010年刚开始写本博客之际,我整理过一个微软面试100题,后来我为这100题开始发帖讨论,写答案上传,至今成了一个系列,即为微软面试100题系列。在整理这个系列的过程当中,越来越强烈的感觉到,可以从那100题中精选一些更为典型的题,每一题详细阐述成章,不断优化,于此,便成了程序员编程艺术系列。
本编程艺术系列从2011年4月至今,写了37个编程问题,通过整理每一年校招的笔试面试题,我们都能发现,许多笔试面试题都是来自此编程艺术系列,从而发觉绝大部分问题,都是有规律可循的,而且可以不断优化。
然个人力量有限,故特意把这37个问题集中到一起,你可以做两件事情:
- 发现本编程艺术系列任何问题、错误、bug,或可以优化的每一段代码,欢迎随时批评指正;
- 欢迎你也来做做这37题,不看答案,自己写自己的代码,一起刷这37题。
反馈方式可以多样,如:
- 你可以直接在本博客上留言show出你的思路和代码,
- 也可以贡献到程序员编程艺术的github上:https://github.com/julycoding/The-Art-Of-Programming_by-July,
- 或微博@研究者July 私信我。
愿我们能共同享受编程和思考的乐趣,thanks。
程序员编程艺术第一~三十七章集锦
第1题、定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串abcdef左旋转2位得到字符串cdefab。
请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。
第2题、假设这有一个各种字母组成的字符串A,和另外一个字符串B,字符串里B的字母数相对少一些。什么方法能最快的查出所有小字符串B里的字母在大字符串A里都有?
比如,如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPO
答案是true,所有在string2里的字母string1也都有。
如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPZ
答案是false,因为第二个字符串里的Z字母不在第一个字符串里。
第3题、输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
第3.1题、搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。
假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。
- 第三章再续:快速选择SELECT算法的深入分析与实现
- 三之三续、求数组中给定下标区间内的第K小(大)元素
第3.2题、给定数组,给定区间,求第K小的数如何处理?
- 第四章、现场编写类似strstr/strcpy/strpbrk的函数
第4题、给定一个字符串A,要求在A中查找一个子串B。如A="ABCDF",要你在A中查找子串B=“CD”,相当于实现strstr库函数。
第5.1题、输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
第5.2题、编程求解:输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来。
第6题、求500万以内的所有亲和数
如果两个数a和b,a的所有真因数之和等于b,b的所有真因数之和等于a,则称a,b是一对亲和数。例如220和284,1184和1210,2620和2924。
第7题、输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。
第9题、在一条左右水平放置的直线轨道上任选两个点,放置两个机器人,请用如下指令系统为机器人设计控制程序,使这两个机器人能够在直线轨道上相遇。(注意两个机器人用你写的同一个程序来控制)
指令系统:只包含4条指令,向左、向右、条件判定、无条件跳转。其中向左(右)指令每次能控制机器人向左(右)移动一步;条件判定指令能对机器人所在的位置进行条件测试,测试结果是如果对方机器人曾经到过这里就返回true,否则返回false;无条件跳转,类似汇编里面的跳转,可以跳转到任何地方。
第10题、输入:给定一个文件,里面最多含有n个不重复的正整数(也就是说可能含有少于n个不重复正整数),且其中每个数都小于等于n,n=10^7。
输出:得到按从小到大升序排列的包含所有输入的整数的列表。
条件:最多有大约1MB的内存空间可用,但磁盘空间足够。且要求运行时间在5分钟以下,10秒为最佳结果。
第11题、什么是最长公共子序列呢?好比一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。
举个例子,如:有两条随机序列,如 1 3 4 5 5 ,and 2 4 5 5 7 6,则它们的最长公共子序列便是:4 5 5。
- 第十二~十五章:数的判断,中签概率,IP访问次数,回文问题(初稿)
第12题、给40亿个不重复的unsignedint的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
第13题、一个文件中含有n个元素,只能遍历一遍,要求等概率随机取出其中之一。
第14题、海量日志数据,提取出某日访问百度次数最多的那个IP。
第15题、判断一个字串是否是回文
- 第十六~第二十章:全排列/跳台阶/奇偶调序,及一致性hash算法
第16题、输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c 所能排列出来的所有字符串
abc、acb、bac、bca、cab 和cba。
第17题、一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级。求总共有多少总跳法,并分析算法的时间复杂度。
第18题、输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。
第19题、在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。
- 第二十一~二十二章:出现次数超过一半的数字,最短摘要的生成
第21题、数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。
第22题、
给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法
String extractSummary(String description,String[] key words)
目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。
- 第二十三、四章:杨氏矩阵查找,倒排索引关键词Hash不重复编码实践
第23题、
在一个m行n列二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字6,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。
第24题、
对倒排索引中的关键词进行编码。那么,这个问题将分为两个个步骤:
- 首先,要提取倒排索引内词典文件中的关键词;
- 对提取出来的关键词进行编码。
- 第二十五章:Jon Bentley:90%无法正确实现二分查找
第25题、请实现二分查找
- 第二十六章:基于给定的文档生成倒排索引的编码与实践
第27题、一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序。比如: input: 1,7,-5,9,-12,15 ,ans: -5,-12,1,7,9,15 。且要求时间复杂度O(N),空间O(1) 。
- 第二十八~二十九章:最大连续乘积子串、字符串编辑距离
第28题、给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积连续子串为3,0.5,8。也就是说,上述数组中,3 0.5 8这3个数的乘积3*0.5*8=12是最大的,而且是连续的。
第29题、给定一个源串和目标串,能够对源串进行如下操作:
1.在给定位置上插入一个字符
2.替换任意字符
3.删除任意字符
写一个程序,返回最小操作数,使得对源串进行这些操作后等于目标串,源串和目标串的长度都小于2000。
- 第三十~三十一章:字符串转换成整数,字符串匹配问题
第30题、输入一个表示整数的字符串,把该字符串转换成整数并输出,例如输入字符串"345",则输出整数345。
给定函数原型int StrToInt(const char *str) ,完成函数StrToInt,实现字符串转换成整数的功能,不得用库函数atoi
第31题、字符串匹配问题,给定一串字符串,按照指定规则对其进行匹配,并将匹配的结果保存至output数组中,多个匹配项用空格间隔,最后一个不需要空格。
要求:
- 匹配规则中包含通配符?和*,其中?表示匹配任意一个字符,*表示匹配任意多个(>=0)字符。
- 匹配规则要求匹配最大的字符子串,例如a*d,匹配abbdd而非abbd,即最大匹配子串。
- 匹配后的输入串不再进行匹配,从当前匹配后的字符串重新匹配其他字符串。
请实现函数:char* my_find(char input[], char rule[])
第32题、给定一个单词集合Dict,其中每个单词的长度都相同。现从此单词集合Dict中抽取两个单词A、B,我们希望通过若干次操作把单词A变成单词B,每次操作可以改变单词的一个字母,同时,新产生的单词必须是在给定的单词集合Dict中。求所有行得通步数最少的修改方法。
举个例子如下:
Given:
A = "hit"
B = "cog"
Dict = ["hot","dot","dog","lot","log"]
Return
[
["hit","hot","dot","dog","cog"],
["hit","hot","lot","log","cog"]
]
即把字符串A = "hit"转变成字符串B = "cog",有以下两种可能:
"hit" -> "hot" -> "dot" -> "dog" -> "cog";
"hit" -> "hot" -> "lot" -> "log" ->"cog"。
第33题、
用 1×1×1, 1× 2×1以及2×1×1的
三种木块(横绿竖蓝,且绿蓝长度均为2),
搭建高长宽分别为K × 2^N × 1的墙,不能翻转、旋转(其中,0<=N<=1024,1<=K<=4)
有多少种方案,输出结果对1000000007取模。
举个例子如给定高度和长度:N=1 K=2,则
答案是7,即有7种搭法,如下图所示:
第34题、有n*n个格子,每个格子里有正数或者0,从最左上角往最右下角走,只能向下和向右,一共走两次(即从左上角走到右下角走两趟),把所有经过的格子的数加起来,求最大值SUM,且两次如果经过同一个格子,则最后总和SUM中该格子的计数只加一次。
第35题、
有个长度为2n的数组{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序后{a1,b1,a2,b2,....,an,bn},请考虑有无时间复杂度o(n),空间复杂度0(1)的解法。
- 第三十六~三十七章、搜索智能提示suggestion,附近地点搜索
第36题、
百度搜索框中,输入“北京”,搜索框下面会以北京为前缀,展示“北京爱情故事”、“北京公交”、“北京医院”等等搜索词,输入“ 结构之
”,会提示“结构之法”,“结构之法 算法之道”等搜索词。
请问,如何设计此系统,使得空间和时间复杂度尽量低。
第37题、找一个点集中与给定点距离最近的点,同时,给定的二维点集都是固定的,查询可能有很多次,时间复杂度O(n)无法接受,请设计数据结构和相应的算法。
- 第三十八章:Hero在线编程判题、出题系统的演进与优化
第38题、Hero在线编程判题、出题系统的演进与优化
如果某一天打开浏览器,便能在网页上直接敲代码,那该有多好,随时随地,不受编译器限制。好事多磨,今年3月终于来CSDN来做这样一个在线编程网站Hero了:http://hero.csdn.net/,以项目负责人的身份总体负责它的产品和运营、包括出题。
PDF免积分下载
欢迎大家先不看我的答案,自己做自己的,可把你的答案直接评论于本篇或原来每一篇下,或集体发到程序员编程艺术的github上:https://github.com/julycoding/The-Art-Of-Programming_by-July 上,talk is cheap,show me your code!当然,如若发现原系列有任何问题,欢迎随时向我反馈,感谢。
最后,分享出程序员编程艺术第1~37章带标签的最新PDF的下载地址(3天3000人下载):http://download.csdn.net/detail/v_july_v/6694053,供你做完后参考。
July、二零一三年十二月十三日。