程序员编程艺术第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 私信我。
程序员编程艺术第一~三十七章集锦
请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。
比如,如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPO
答案是true,所有在string2里的字母string1也都有。
如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPZ
答案是false,因为第二个字符串里的Z字母不在第一个字符串里。
假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。
第4题、给定一个字符串A,要求在A中查找一个子串B。如A="ABCDF",要你在A中查找子串B=“CD”,相当于实现strstr库函数。
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
如果两个数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。
指令系统:只包含4条指令,向左、向右、条件判定、无条件跳转。其中向左(右)指令每次能控制机器人向左(右)移动一步;条件判定指令能对机器人所在的位置进行条件测试,测试结果是如果对方机器人曾经到过这里就返回true,否则返回false;无条件跳转,类似汇编里面的跳转,可以跳转到任何地方。
输出:得到按从小到大升序排列的包含所有输入的整数的列表。
条件:最多有大约1MB的内存空间可用,但磁盘空间足够。且要求运行时间在5分钟以下,10秒为最佳结果。
第11题、什么是最长公共子序列呢?好比一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。
举个例子,如:有两条随机序列,如 1 3 4 5 5 ,and 2 4 5 5 7 6,则它们的最长公共子序列便是:4 5 5。
abc、acb、bac、bca、cab 和cba。
String extractSummary(String description,String[] key words)
目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。
例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字6,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。
第24题、 对倒排索引中的关键词进行编码。那么,这个问题将分为两个个步骤:
- 首先,要提取倒排索引内词典文件中的关键词;
- 对提取出来的关键词进行编码。
1.在给定位置上插入一个字符
2.替换任意字符
3.删除任意字符
写一个程序,返回最小操作数,使得对源串进行这些操作后等于目标串,源串和目标串的长度都小于2000。
给定函数原型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";第33题、 用 1×1×1, 1× 2×1以及2×1×1的 三种木块(横绿竖蓝,且绿蓝长度均为2),"hit" -> "hot" -> "lot" -> "log" ->"cog"。
搭建高长宽分别为K × 2^N × 1的墙,不能翻转、旋转(其中,0<=N<=1024,1<=K<=4)
有多少种方案,输出结果对1000000007取模。
举个例子如给定高度和长度:N=1 K=2,则 答案是7,即有7种搭法,如下图所示:
第35题、 有个长度为2n的数组{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序后{a1,b1,a2,b2,....,an,bn},请考虑有无时间复杂度o(n),空间复杂度0(1)的解法。
第37题、找一个点集中与给定点距离最近的点,同时,给定的二维点集都是固定的,查询可能有很多次,时间复杂度O(n)无法接受,请设计数据结构和相应的算法。
第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、二零一三年十二月十三日。