剑指offer
AI让世界更懂你
计算机科学与技术专业博士,主要研究方向为人工智能、自然语言处理、大规模语言模型和对话系统等。曾与微软小冰、微软小娜共同工作。兴趣广泛,包括并不限于人工智能,心理学,认知科学,语言学,数学,天文学等。让我们一起和AI,改进世界!
展开
-
剑指offer——变态跳台阶
1. 问题描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。2.求解方法这道题目之所以称为是变态跳台阶,是因为它是跳台阶的一个变种。我们来回顾一下跳台阶的题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。可以看到他们俩之间的差距,一个是只需要回顾前2个状态,一个是需要回顾前n原创 2017-03-27 19:18:21 · 856 阅读 · 0 评论 -
剑指offer——替换空格
1. 问题描述 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。2. 解答思路对于这一题,考察的是字符串的知识,不过我们还是想由浅入深的来进行思考。2.1 level1看到字符串替换,那么首先想到的应该是replace,这毋庸置疑,于是乎,就有了下面的代码:public static St原创 2017-07-04 20:47:52 · 585 阅读 · 0 评论 -
剑指offer——从尾到头打印链表
1. 问题描述 输入一个链表,从尾到头打印链表每个节点的值。2. 解决思路题目已经给出了一个预先定义好的链表: public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }那么原创 2017-07-05 18:55:09 · 416 阅读 · 0 评论 -
剑指offer——栈的压入、弹出序列
1. 问题描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)2. 解决方案2.1 level1这其实也是在学数据结构的时候一道经典例题。它就是原创 2017-07-14 18:56:42 · 843 阅读 · 0 评论 -
剑指offer——从上往下打印二叉树
1. 问题描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印。2. 解决方法其实这道题就是二叉树的层次遍历。这个在学数据结构的时候就已经考察了。其主要思想就是建立一个队列,然后递归的入队出队即可。2.1 level1按照上述思想,如下展示:ArrayList<Integer> alArrayList=new ArrayList<Integer>(); Queue<TreeNod原创 2017-07-15 21:07:48 · 465 阅读 · 0 评论 -
剑指offer——重建二叉树
1. 问题描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。2. 解决方法这个问题其实在学习数据结构的时候这道题是非常经典的题目,当时还是手算的,不仅是给出前序和中序,还有给出中序和后序的,所以原理上我们原创 2017-07-06 21:29:30 · 511 阅读 · 0 评论 -
剑指offer——数组中出现次数超过一半的数字
1. 问题描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。2. 解答方法这是一个非常古老的题目了,但是仍然十分经典。2.1 level1这个题目按照普通的想法,应该是进行字典统计,在之前一直喜欢用数组,但是数组还是比较慢的,比较原创 2017-07-07 19:33:30 · 495 阅读 · 0 评论 -
剑指offer——顺时针打印矩阵
1. 问题描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.2. 解决方法2.1 level1这也是一道非常经典的题目,记得曾经是使用C语言写的,最简单的方法就是按照题目要求这样打原创 2017-07-09 15:13:33 · 471 阅读 · 0 评论 -
剑指offer——连续子数组的最大和
1. 题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向原创 2017-07-22 21:49:59 · 840 阅读 · 0 评论 -
剑指offer——二叉树镜像、反转单词序列
1. 引言这一次和之前的不太一样,因为这一次是同时写两题,因为这两题比较相近,而且各自没有太多可以挖掘的地方,就把它们放在一起了。2. 二叉树镜像2.1 问题描述 操作给定的二叉树,将其变换为源二叉树的镜像。 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \原创 2017-06-11 21:11:15 · 555 阅读 · 0 评论 -
剑指offer——二维数组中的查找
1. 问题描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。2. 解答思路由题目可知,这个题目有2个天然顺序,也就是从左到右是递增的,从上到下是递增的。由信息熵理论也可以知道,这条信息的信息熵并不大,因为我们需要的是有辨别度的信息,也就是说,如果数目大了会去哪,数目小了会去原创 2017-07-02 23:25:36 · 634 阅读 · 0 评论 -
剑指offer——调整数组顺序使奇数位于偶数前面
1. 问题描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。2. 解决办法这个解决方法应该很容易想到这样一个办法,那就是把奇数先全部找出来,然后把偶数全部找出来,然后把两个数组拼接起来就可以了。这既是一个非常容易想到的办法,而且也是正常人做这件事情的过程。实际上,这样原创 2017-04-27 14:55:00 · 553 阅读 · 0 评论 -
剑指offer——矩形覆盖
1. 问题描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?2. 求解方法看似困难的题目,实际上,就是斐波那契数列的变种而已,通过画图可以清楚的看出:f(0)=0,f(1)=1,f(2)=2,f(3)=3...f(0)=0,f(1)=1,f(2)=2,f(3)=3...那么为什么不是归纳为f(n)=n呢?大家可原创 2017-04-06 22:07:36 · 566 阅读 · 0 评论 -
剑指offer——旋转数组的最小数字
1. 问题描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。2.求解方法这个题目第一眼看过去,就是查找算法。如果你首先想到的是遍历,那么还需要多原创 2017-03-22 20:15:01 · 617 阅读 · 0 评论 -
剑指offer——斐波那契数列
1. 问题描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=392. 求解方法首先,我们要明确一下斐波那契数列,因为对于斐波那契数列还是有一些争议的,正确的斐波那契数列是这样的:0,1,1,2,3,5,8…但是我们接触斐波那契数列的时候,是由生兔子接触的,所以会误认为是1,1,2,3,5,8…再者,我们程序员的第几项,都是从第0项开始,这点没有什原创 2017-03-23 22:17:00 · 916 阅读 · 2 评论 -
剑指offer——二进制中1的个数
1.问题描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。2.解决方法2.1 level1看到这个题目第一反应是什么呢?在回想什么是补码,如何把一个整数转换成2进制。这是一个非常通用的想法。我们最先知道的就是使用对二整除、求余两种运算,能够保证整个功能实现,那么省下的就是要处理补码的问题,补码是针对负数的,负数的补码符号位为1,并且使原码的取反加一。但它真正的含义是去除符号原创 2017-04-10 12:28:32 · 1048 阅读 · 2 评论 -
剑指offer——链表中倒数第k个结点
1. 问题描述 输入一个链表,输出该链表中倒数第k个结点。2. 解决方案遇到链表,那么肯定是在考察数据结构的相关知识。对于一个单链表来讲,其实还是没那么复杂。另外就是在进行手写数据结构的链表、队列、栈、树、图的时候,一定要注意鲁棒性,包括下标和指针的使用。对于这题来讲,首先想到的可能是先统计一遍,然后再往回倒腾k个即可。但是这样的话,如果使用java自带的链表先恢复一遍可以。也可以使用一个栈来原创 2017-05-01 14:09:47 · 550 阅读 · 0 评论 -
剑指offer——数值的整数次方
1.问题描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。2.解决方法2.1 level1这道题,首先的第一反应就是使用最基础的,把指数运算换成连乘运算,然后通过编码实现,这个不难。public static double Power( double base, int exponent) { //如果为负数,则原创 2017-04-15 19:11:58 · 591 阅读 · 0 评论 -
剑指offer——反转链表
1. 题目描述 输入一个链表,反转链表后,输出链表的所有元素。2. 解决方法反转链表是一个非常基础的操作,但是也是一个非常有技术含量的操作。能看出一个人的基本功扎不扎实。2.1 level1反转链表,反转,第一眼应当想到的是栈,因为栈具有这样的特性。所以我们可以使用栈来辅助我们完成这个操作。代码如下:/*public class ListNode { int val; Lis原创 2017-05-04 21:10:18 · 582 阅读 · 0 评论 -
剑指offer——合并链表
1. 问题描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。2. 解决方法合并链表应该是数据结构里最经典的一道题目。两个链表合并,当然是要一次对比两个链表开头谁更小,谁就当做新的头,然后依次类推下去。2.1 level1还记得当时不是用递归写的,一点一点合并的。现在知道怎么用递归了,就用递归写一个吧。代码看起来是真的挺简洁的。public sta原创 2017-05-06 11:27:46 · 561 阅读 · 3 评论 -
剑指offer——最小的K个数
1. 问题描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。2.问题解答这相当于部分排序,想法也有可能是多种多样,基本上是在查找与排序上进行一些优化。如何让两个子任务获得平衡的衔接,是要思考的问题。2.1 level1最简单的办法就是查找K次,每次查找最小的那个数加入到最终结果中,这样的时间复杂度是O(KN),这还是原创 2017-08-06 23:10:59 · 782 阅读 · 0 评论