算法大神左程云耗尽5年心血分享程序员代码面试指南第2版文档

前言

学习是一种基础性的能力。然而,“吾生也有涯,而知也无涯。”,如果学习不注意方法,则会“以有涯随无涯,殆矣”。

学习就像吃饭睡觉一样,是人的一种本能,人人都有学习的能力。我们在刚出生的时候,什么也不知道,是一张真正的白纸,我们靠学习的本能,学会了走路、说话、穿衣服…后来,我们上学了,老师把书本上的知识一点一点灌输到我们的脑子里,我们掌握的知识越来越多,与此同时,我们学习能力却好像越来越差了,习惯了被别人喂饱,似乎忘记了怎么来喂自己了。

学习本来只是一种本能,算不上什么能力,然而,经过二十多年的不断学习,学习反而成为了一种真正的能力,因为我们慢慢失去了它,它就更显得珍贵。

作为一个程序员,不断的学习更是重要,不学新的知识就迟早会被淘汰掉

对工程师而言,算法既是基础能力,也是进阶突破的必备能力。

本文内容深入浅出,不仅涉及算法知识本身,更能让读者解决问题的思维升级。不论是面试准备,还是日常学习,本文都可以成为你进入算法世界的不二选择。

相比在网上泛泛地刷题,本文更强调最优解和举一反三的能力。对算法原型的介绍也能帮助程序员更高效地准备面试与提升自己,以及在不断变化的题目中迅速找到思路。

也是程序员求职或跳槽刷题人的优选之作!作者用丰富的工作经验和对算法的深刻理解,通过精辟的示例,把代码面试题目最优解解释得简明和“平易近人”。

本文中,作者通过自己对常见算法知识的理解,精心选择了一道道真实的高频面试题,循序渐进地提升题目难度,辅以翔实的解题思路,让读者真正学得到内容,并学得下去。

本文将从目录、主要内容、专家大牛对本文的评价、相比第1版有哪些改进四部分给大家介绍,希望大家能够把里面的内容全部掌握,并且能够学以致用,也希望能够得到大家的喜欢!

目录

主要内容

本文是程序员代码面试宝典!文中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。

**第1章栈和队列,**设计一个有getMin功能的栈

由两个栈组成的队列

如何仅用递归函数和栈操作逆序一个栈

猫狗队列

用一个栈实现另一个栈的排序

用栈来求解汉诺塔问题

生成窗口最大值数组

单调栈结构

求最大子矩阵的大小

最大值减去最小值小于或等于num的子数组数量

可见的山峰对数量

第2章链表问题,

打印两个有序链表的公共部分

在单链表和双链表中删除倒数第K个节点

删除链表的中间节点和a/b处的节点

反转单向和双向链表

反转部分单向链表

环形单链表的约瑟夫问题

判断一个链表是否为回文结构(普通解法 进阶解法尉)

将单向链表按某值划分成左边小、中间相等、右边大的形式

复制含有随机指针节点的链表

两个单链表生成相加链表

两个单链表相交的一系列问题

将单链表的每K个节点之间逆序

删除无序单链表中值重复出现的节点

在单链表中删除指定值的节点

将搜索二叉树转换成双向链表

单链表的选择排序

一种怪异的节点删除方式

向有序的环形单链表中插入新节点

合并两个有序的单链表

按照左右半区的方式重新组合单链表

第3章二叉树问题,

分别用递归和非递归方式实现二叉树先序、中序和后序遍历

打印二叉树的边界节点

如何较为直观地打印二叉树

二叉树的序列化和反序列化

遍历二叉树的神级方法

在二叉树中找到累加和为指定值的最长路径长度

找到二叉树中的最大搜索二叉子树

找到二叉树中符合搜索二叉树条件的最大拓扑结构

二叉树的按层打印与ZigZag打印

调整搜索二叉树中两个错误的节点

判断t1树是否包含t2树全部的拓扑结构

判断t1树中是否有与t2树拓扑结构完全相同的子树

判断二叉树是否为平衡二叉树

根据后序数组重建搜索二叉树

判断- -棵二叉树是否为搜索二叉树和完全二叉树

通过有序数组生成平衡搜索二叉树

在二叉树中找到一个节点的后继节点

在二叉树中找到两个节点的最近公共祖先

Tarjan算法与并查集解决二叉树节点间最近公共祖先的批量查询问题

二叉树节点间的最大距离问题

派对的最大快乐值

通过先序和中序数组生成后序数组

统计和生成所有不同的二叉树

统计完全二叉树的节点数

**第4章递归和动态规划,**斐波那契数列问题的递归和动态规划

矩阵的最小路径和

换钱的最少货币数

机器人达到指定位置方法数

换钱的方法数

打气球的最大分数

最长递增子序列

信封嵌套问题

汉诺塔问题

最长公共子序列问题

最长公共子串问题

子数组异或和为0的最多划分

最小编辑代价

字符串的交错组成

龙与地下城游戏问题

数字字符串转换为字母组合的种数

表达式得到期望结果的组成种数

排成一条线的纸牌博弈问题

跳跃游戏

数组中的最长连续序列

N皇后问题

**第5章字符串问题.**判断两个字符串是否互为变形词;

判断两个字符串是否互为旋转词

将整数字符串转成整数值

字符串的统计字符串

判断字符数组中是否所有的字符都只出现过一- 次

在有序但含有空的数组中查找字符串

字符串的调整与替换

翻转字符串

完美洗牌问题

删除多余字符得到字典序最小的字符串

数组中两个字符串的最小距离

字符串的转换路径问题

添加最少字符使字符串整体都是回文字符串

括号字符串的有效性和最长有效长度

公式字符串求值

0左边必有1的二进制字符串数量

拼接所有字符串产生字典顺序最小的大写字符串

找到字符串的最长无重复字符子串

找到指定的新类型字符

旋变字符串问题

最小包含子串的长度

回文最少分割数

字符串匹配问题

字典树(前缀树)的实现

子数组的最大异或和

**第6章大数据和空间限制,**认识布隆过滤器

只用2GB内存在20亿个整数中找到出现次数最多的数

40亿个非负整数中找到未出现的数

找到100亿个URL中重复的URL及搜索词汇的TopK问题

40亿个非负整数中找到出现两次的数和所有数的中位数

一致性哈希算法的基本原理

岛问题

**第7章位运算,**不用额外变量交换两个整数的值

不用做任何比较判断找出两个数中较大的数

只用位运算不用算术运算实现整数的加减乘除运算

整数的二进制数表达中有多少个1

在其他数都出现偶数次的数组中找到出现奇数次的数

在其他数都出现k次的数组中找到只出现一次的数

**第8章数组和矩阵问题,**转圈打印矩阵

将正方形矩阵顺时针转动90°

“之”字形打印矩阵

找到无序数组中最小的k个数

需要排序的最短子数组长度

在数组中找到出现次数大于N/K的数

在行列都排好序的矩阵中找指定数

最长的可整合子数组的长度

不重复打印排序数组中相加和为给定值的所有二元组和三元组

未排序正数数组中累加和为给定值的最长子数组长度

未排序数组中累加和为给定值的最长子数组系列问题

未排序数组中累加和小于或等于给定值的最长子数组长度

计算数组的小和

自然数数组的排序

奇数下标都是奇数或者偶数下标都是偶数

子数组的最大累加和问题

子矩阵的最大累加和问题

在数组中找到一一个局部最小的位置

数组中子数组的最大累乘积

打印N个数组整体最大的TopK

边界都是1的最大正方形大小

不包含本位置值的累乘数组

数组的partition 调整

求最短通路值

数组中未出现的最小正整数

数组排序之后相邻数的最大差

做项目的最大收益问题

分金条的最小花费

大楼轮廓问题

加油站良好出发点问题

容器盛水问题

**第9章其他题目,**从5随机到7随机及其扩展,(原问题尉,补充问题,进阶问题

一行代码求两个数的最大公约数

有关阶乘的两个问题

判断一个点是否在矩形内部

判断一个点是否在三角形内部

折纸问题

能否完美地拼成矩形

蓄水池算法

设计有setAll功能的哈希表

最大的leftMax与rightMax 之差的绝对值

设计LRU缓存结构

LFU缓存结构设计

设计RandomPool结构

并查集的实现

调整[0,x)区间上的数出现的概率

路径数组变为统计数组

正数数组的最小不可组成和

累加出整个范围所有的数最少还需几个数

一种字符串和数字的对应关系

1到n中 1出现的次数

从N个数中等概率打印M个数

判断一个数是否是回文数

在有序旋转数组中找到最小值

在有序旋转数组中找到一个数

数字的英文表达和中文表达

分糖果问题

一种消息接收并打印的结构设计

随时找到数据流的中位数

在两个长度相等的排序数组中找到上中位数

在两个排序数组中找到第k小的数

两个有序数组间相加和的Topk问题

出现次数的Topk问题

Manacher算法

KMP算法

丢棋子问题

画匠问题

邮局选址问题

总结

一、来看一下大牛对本文的高度评价!

二、相比第一版的内容,第2版有什么新的内容增加或者修改呢?

1.修改了第1版部分题目的解释,并增加了更多示例。

2.增加了很多近年来新出现的流行面试题,删掉了已经很少出现的低频面试题。

3.把经常出现的解题套路与算法原型做了结构化的调整和总结。

4.本文所有题目的代码都用Java语言实现,但这并不会妨碍其他语言使用者的阅读。

这是因为笔者尽最大努力回避了与Java语言特性相关的代码实现,而且尽量遵循大多数编程语言共有的写法习惯。因此,将本书中的Java语言实现改写成其他语言的实现是非常容易的。

5.在Java语言中,如果想得到字符串str第i个位置的字符,则需用如下方式:

char p = str.charAt(i);

本文提供的函数中有大量参数为字符串类型的函数,但如上所示的方式并不符合大多数读者的阅读习惯。为了让代码更加易读,笔者在这些函数中把字符串类型的参数转换成char类型数组的变量来使用。例如:

char] charArr = str.toCharArray();

此时得到字符串str第i个位置的字符,可以用如下方式:

char p = charArr[i];

在本文中,发生如上转换行为的函数在估算额外空间复杂度时,笔者并没有把charArr的空间计算在内,这是因为如果不转换成char数组,而是选择直接使用原参数str,也是完全可以的,之所以选择转换,仅仅是为了让读者更容易读懂代码;是否进行转换对算法的逻辑没有任何影响,所以不把charArr的空间算作必须使用的额外空间。

C、C++语言是IT行业的主流编程语言,也是很多程序员必备的软件基本功,是软件开发行业招聘考查的重点。本书以流行的面试题讲解为主要内容,介绍了C、C++语言基本概念,包括保留字、字符串、指针和引用、结构体、库函数等各个方面的基础知识,介绍了面向对象编程基本概念,包括如何实现继承、多态和封装等。还介绍了排序算法及数据结构的实现,包括链表、堆栈、队列和树。此外,本书开始用两章篇幅详细介绍了中英文面试的注意事项、常见问题及程序员的职业规划等软件工程师的常识。最后四章详细讲解了现在流行的智力测试题。 第一篇 求职 第1章 应聘求职 1.1 企业与人才 1.1.1 企业需要什么样的人才 1.1.2 如何成为企业需要的人才 1.2 做好面试的准备 1.2.1 面试衣着 1.2.2 简历 1.3 面试 1.3.1 面试注意事项 1.3.2 面试问题分析 问题一:“请自我介绍一下。” 问题二:“谈谈你的家庭情况。” 问题三:“你有什么业余爱好?” 问题四:“你最崇拜谁?” 问题五:“谈谈你的缺点。” 问题六:“谈一谈你的一次失败经历。” 问题七:“你为什么选择我们公司?” 问题八:“对这项工作,你可预见到哪些困难?” 问题九:“如果我们录用你,你将怎样开展工作?” 问题十:“与上级意见不一致,你将怎么办?” 问题十一:“我们为什么要录用你?” 问题十二:“你能为我们做什么?” 问题十三:“你是应届毕业生,缺乏经验,如何能胜任这项工作?” 问题十四:“你希望与什么样的上级共事?” 问题十五:“你在前一家公司的离职原因是什么?” 1.4 为明天做好计划 第2章 英文面试 2.1 英文电话面试 2.1.1 英文电话面试注意事项 2.1.2 英文电话面试常见   问题 问题一:When will you graduate? 问题二:How do you normally handle criticism? 问题三:Why should we hire you? 问题四:Please tell me something unreflected at your resume/about yourself/ your experience/your activities. 2.1.3 英文电话面试常用词汇 2.2 英文面试 2.2.1 英文简历 2.2.2 英文面试流程 2.2.3 英文面试注意事项 2.2.4 英文面试常见问题 问题一:What is your strongest trait? 问题二:How would your friends or colleagues describe you? 问题三:What personality traits do you admire? 问题四:What leadership qualities did you develop as an administrative personnel? 问题五:How do you normally handle criticism? 问题六:What do you find frustrating in a work situation? 问题七:How do you handle your failure? 问题八:What kinds of people do you like to work with? 2.2.5 英文面试常用词汇 2.3 计算机专业英语面试常用词汇 第二篇 C/C++面试题 第3章 C/C++程序基础 3.1 基本概念 面试题1:什么是C语言语句 面试2:变量的声明和定义有什么区别 面试题3:下列字符中,哪些不是C语言关键字 面试题4:下列变量定义中,哪些是合法的 面试5:如何以最简单的方式让电脑蜂鸣器发出声音 3.2 编程规范 面试题6:谈谈你对编程规范的理解或认识 面试题7:函数、变量等命名都有哪些规则 面试题8:写出bool、int、float、指针变量与“零值”比较的if语句 3.3 数据类型 面试题9:写出代码的输出结果 面试题10:C语言中不合法的整型常数 面试题11:short i = 0; i = i + 1L;这两句有错吗 面试题12:char x[] = {"abcd"}和 char y[] = {'a','b','c','d'} 有不同吗 面试题13:char型数据在内存中的存储形式 3.4 运算符 面试题14:请写出下列代码的输出内容 面试题15:运算符的优先级问题 面试题16:&&和&,||和|有什么区别 面试题17:什么是值,什么是右值 面试题18:请写出程序的运行结果 面试题19:sizeof和strlen的区别 3.5 结构体 面试20:结构体是什么样的数据类型 面试21:结构体可以直接赋值吗 面试22:组织WAV文件头,并解析WAV格式的各项信息 面试23:计算学生不及格的人数打印他们的性别、姓名和成绩 面试24:结构体内存对齐问题 3.6 C和C++的区别 面试25:关键字static在C和C++中的区别 面试26:C语言的结构体和C++的有什么区别 面试27:C中的malloc和C++中的new有什么区别 面试28:C++的引用和C语言的指针有什么区别 第4章 预处理、保留字 4.1 预处理 面试题1:简述#ifdef、#else、#endif和#ifndef的作用 面试2:宏定义和函数 面试题3:用#define声明一个常数 面试题4:写一个“标准”宏MIN 面试5:typedef和define有什么区别 面试题6:#define CHAR char*和typedef char* CHAR各有什么优劣 面试题7:谈谈你对typedef的认识 4.2 const(常量) 面试题8:关键字const是什么 面试题9:说明以下a声明的含义 面试题10:const、define定义常量的区别 4.3 static(静态)和extern 面试题11:static有什么作用 面试题12:extern有什么作用 面试题13:简述变量存储类型 4.4 volatile 面试题14:volatile有什么作用 面试题15:一个参数可以既是const又是volatile吗 面试题16:一个指针可以是volatile吗 第5章 引用和指针 5.1 引用 面试题1:什么是引用 面试2:常引用有什么作用 面试题3:流操作符重载为什么返回引用 5.2 指针 面试题4:说明以下声明的含义 面试5:简述指针常量与常量指针区别 面试题6:写出以下代码的输出结果 面试题7:找出代码的错误 5.3 指针和数组 面试题8:写出代码的输出结果 面试题9:请问这段程序有问题吗 面试题10:a和&a有什么区别 面试题11:请问代码有什么问题 面试题12:数组名和指针的区别 5.4 函数指针 面试题13:请解析(*(void (*)())0)()的含义 面试题14:指出程序的错误 5.5 “野指针” 面试题15:如何避免“野指针” 面试题16:程序是否正确 面试题17:指出程序的错误 5.6 动态内存 面试题18:简述C、C++程序编译的内存分配情况 面试题19:以下四段代码中哪段没有错误 第6章 字符串 6.1 数字字符串 面试题1:编码实现数字转化为字符串 面试2:编码实现字符串转化为数字 6.2 字符串函数 面试题3:编写一个标准strcpy函数 面试题4:简述strcpy、sprintf与memcpy的区别 6.3 字符串与数组 面试5:找出程序的错误之处 面试题6:判断程序会出现什么问题 第7章 嵌入式编程 面试题1:编码实现某一变量某位清或置 面试2:用C编写一个死循环程序 面试题3:用变量a给出下面的定义 面试题4:设置地址为0x67a9的整型变量的值为0xaa66 面试5:评论下面这个中断函数 面试题6:评价一个代码片段 第8章 面向对象 8.1 面向对象的基本概念 面试题1:谈谈你对面向对象的认识 面试2:面向对象的三大特征 面试题3:面向过程和面向对象有什么区别 8.2 类的成员变量和成员函数 面试题4:简述类public、protected、private的作用 面试5:写出代码的打印结果 面试题6:写出程序的打印结果 面试题7:C++的空类有哪些成员函数 8.3 构造函数和析构函数 面试题8:构造函数能否为虚函数 面试题9:简述子类与父类的析构、构造函数的调用顺序 面试题10:编写类String 的构造函数、析构函数和赋值函数 8.4 拷贝构造函数 面试题11:谈谈对拷贝构造函数和赋值运算符的认识 面试题12:写出当定义#define _INMAIN 0和不定义时代码打印结果 第9章 继承与多态 9.1 继承 面试题1:指出程序的错误 面试2:用C++设计一个不能被继承的类 9.2 虚函数和纯虚函数 面试题3:下面说法中正确的是哪个 面试题4:写出程序的打印结果 面试5:访问基类的私有虚函数 9.3 多态 面试题6:简述类成员函数的重写、重载和隐藏的区别 面试题7:简述多态实现的原理 第10章 数据结构 10.1 链表 面试题1:链表和数组有什么区别 面试2:寻找单链表中间结点 面试题3:怎样把一个单链表反序 10.2 单循环链表 面试题4:根据需求建立一个单向循环链表 面试5:检测一个较大的单向链表是否带环 10.3 双向链表 面试题6:按要求构造一个双向链表 面试题7:编程实现双链表插入新结点 面试题8:编程实现双链表删除指定结点 10.4 栈和队列 面试题9:简述队列和栈的异同 面试题10:建立一个链式栈 面试题11:建立一个链式队列 面试题12:能否用两个栈实现一个队列的功能 10.5 二叉树 面试题13:建立一个二叉树 面试题14:计算一棵二叉树的深度 面试题15:在二元树中找出和为某一值的所有路径 第11章 排序 11.1 插入排序 面试题1:编码实现直接插入排序 面试2:编码实现希尔(Shell)排序 11.2 交换排序 面试题3:编码实现冒泡排序 面试题4:编码实现快速排序 11.3 选择排序 面试5:编码实现直接选择排序 面试题6:编程实现堆排序 11.4 基数排序 面试题7:编程实现基数排序 第三篇 智力测试 第12章 基本方法 面试题1:斯密斯夫妇握手问题 面试25个强盗分100颗宝石 面试题3:分牛 面试题4:谁在说谎 面试5:是亏了还是赚了 面试题6:小虫分裂问题 面试题7:飞机绕地球环行问题 第13章 数学能力 面试题1:用一笔画出经过9个点的4条直线 面试2:在9个点上画10条线 面试题3:100盏灯 面试题4:找出不同的球 面试5:时针、分针和秒针重合问题 面试题6:可以喝多少瓶汽水 面试题7:怎样拿到第100号球 面试题8:烧绳计时 面试题9:分金条 面试题10:至少有多少人及格 面试题11:如何取3升水 面试题12:将16升水平均分给四个人 面试题13:如何将140克的盐分成50、90克各一份 面试题14:蜗牛几天能爬到井口 面试题15:100美元的差额到哪里去了 面试题16:点击鼠标比赛 面试题17:小猴最多能运回多少根香蕉 面试题18:算出小张买了几瓶啤酒、几瓶饮料 面试题19:牧场有多少匹马 面试20:找出不同的苹果 面试21:如何穿越沙漠 第14章 推理能力 面试题1:怎么少了100元 面试2:村里有多少条病狗 面试题3:他们都在做什么 面试题4:躯体与灵魂 面试5:小明一家能否安全过桥 面试题6:过河   问题 面试题7:这是张什么牌 面试题8:说谎岛上的两个部落 面试题9:谁是特尔斐城的预言家 面试题10:哪个政党获胜 面试题11:每个护士星期几休息 面试题12:每个人系的圆牌都是什么颜色的 面试题13:帽子问题 面试题14:谁是凶手 面试题15:他们的头发是什么颜色的 面试题16:谁是漂亮的青 面试题17:哪个袋子里有金子 面试题18:他们星期几在说谎 面试题19:剩下的是什么牌 面试20:老李的儿子们是做什么的 面试21:史密斯家的门牌号 面试22:尤克利地区的电话 面试23:乡村庙会的15点游戏 面试24:各家的孩子得了第几名 面试25:经理应该带谁出差 面试26:法官的判决 面试27:张老师的生日是哪一天 面试28:谁是M小姐的情人 面试29:他们分别是哪国人 面试题30:他们分别是做什么的 面试题31:他们都会说什么语言 面试题32:怎么把马匹从甲村拉到乙村 面试题33:谁打碎了花瓶 面试题34:分机票 面试题35:石头有多重 面试题36:该释放谁 面试题37:谁打碎的玻璃 面试题38:谁是最优秀的医生 面试题39:今天星期几 面试题40:五个人进行汽车竞赛 面试题41:下一行是什么 面试题42:三筐水果各是什么 面试题43:最后剩下的是谁 第15章 反应能力 面试题1:下水道的井盖 面试2:30秒答题 面试题3:一分钟答题 面试题4:镜子中的你 面试5:埃及古币 面试题6:投硬币 面试题7:他在撒谎吗 面试题8:制造零件 面试题9:不喜欢正方形窗户的人 面试题10:孩子租房 面试题11:重男轻女的国度 面试题12:分遗产 面试题13:栽果树 面试题14:聪明的农民 面试题15:聪明的死刑犯 面试题16:幼儿园中奇怪的人 面试题17:奇怪的城镇 面试题18:聪明的商人 面试题19:渡船过河 面试20:愚蠢的长工 面试21:红球和白球 面试22:小明坐在了哪里 面试23:乌龟赛跑 面试24:老师的爱恋 面试25:爬楼梯 面试26:马丁先生的约会 面试27:巧入房间 面试28:管子中的球 面试29:女儿的错
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值