程序员编程艺术第1~38章集锦与总结,及Github、PDF下载
\html
熟悉本blog的朋友大都知道,在2010年刚开始写本博客之际,我整理过一个微软面试100题,后来我为这100题开始发帖讨论,写答案上传,至今成了一个系列,即为微软面试100题系列。在整理这个系列的过程中,愈来愈强烈的感受到,能够从那100题中精选一些更为典型的题,每一题详细阐述成章,不断优化,于此,便成了程序员编程艺术系列。git
本编程艺术系列从2011年4月至今,写了37个编程问题,经过整理每年校招的笔试面试题,咱们都能发现,许多笔试面试题都是来自此编程艺术系列,从而发觉绝大部分问题,都是有规律可循的,并且能够不断优化。程序员
然我的力量有限,故特地把这37个问题集中到一块儿,你能够作两件事情:github
反馈方式能够多样,如:面试
愿咱们能共同享受编程和思考的乐趣,thanks。算法
\编程
第1题、 定义字符串的左旋转操做:把字符串前面的若干个字符移动到字符串的尾部,如把字符串abcdef左旋转2位获得字符串cdefab。
请实现字符串左旋转的函数,要求对长度为n的字符串操做的时间复杂度为O(n),空间复杂度为O(1)。 \数组
\浏览器
第2题、 假设这有一个各类字母组成的字符串A,和另一个字符串B,字符串里B的字母数相对少一些。什么方法能最快的查出全部小字符串B里的字母在大字符串A里都有?\markdown
好比,若是是下面两个字符串:
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。\
\
\
第3.2题、 给定数组,给定区间,求第K小的数如何处理?\
\
第4题、 给定一个字符串A,要求在A中查找一个子串B。如A="ABCDF",要你在A中查找子串B=“CD”,至关于实现strstr库函数。
\
第5.1题、 输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。若是有多对数字的和等于输入的数字,输出任意一对便可。
例如输入数组一、二、四、七、十一、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。
\
第12题、 给40亿个不重复的unsignedint的整数,没排过序的,而后再给一个数,如何快速判断这个数是否在那40亿个数当中?
第13题、 一个文件中含有n个元素,只能遍历一遍,要求等几率随机取出其中之一。
第14题、 海量日志数据,提取出某日访问百度次数最多的那个IP。
第15题、 判断一个字串是不是回文
\
第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个关键字(每一个关键词至少出现一次)的长度最短的子串,做为产品简介输出。
\
第23题、 在一个m行n列二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例以下面的二维数组就是每行、每列都递增排序。若是在这个数组中查找数字6,则返回true;若是查找数字5,因为数组不含有该数字,则返回false。\
第24题、 对倒排索引中的关键词进行编码。那么,这个问题将分为两个个步骤:
\
第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数组中,多个匹配项用空格间隔,最后一个不须要空格。
要求:\
请实现函数: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)的解法。
\
第36题、 百度搜索框中,输入“北京”,搜索框下面会以北京为前缀,展现“北京爱情故事”、“北京公交”、“北京医院”等等搜索词,输入“ 结构之 ”,会提示“结构之法”,“结构之法 算法之道”等搜索词。 请问,如何设计此系统,使得空间和时间复杂度尽可能低。
第37题、 找一个点集中与给定点距离最近的点,同时,给定的二维点集都是固定的,查询可能有不少次,时间复杂度O(n)没法接受,请设计数据结构和相应的算法。
\
第38题、Hero在线编程判题、出题系统的演进与优化
若是某一天打开浏览器,便能在网页上直接敲代码,那该有多好,随时随地,不受编译器限制。好事多磨,今年3月终于来CSDN来作这样一个在线编程网站Hero了:hero.csdn.net/,以项目负责人的身份整体负责它的产品和运营、包括出题。
\
欢迎你们先不看个人答案,本身作本身的,可把你的答案直接评论于本篇或原来每一篇下,或集体发到程序员编程艺术的github上:github.com/julycoding/… 上,talk is cheap,show me your code!固然,如若发现原系列有任何问题,欢迎随时向我反馈,感谢。
最后,分享出程序员编程艺术第1~37章带标签的最新PDF的下载地址(3天3000人下载):download.csdn.net/detail/v_ju…,供你作完后参考。
July、二零一三年十二月十三日。\