
剑指offer
不止于代码
这个作者很懒,什么都没留下…
展开
-
剑指offer面试题61:扑克牌中的顺子(Java 实现)
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子, 即这5张牌是不是连续的。2~10为数字本身, A为1。 J为11、Q为12、 为13。小王可以看成任意数字。测试用例:1、功能测试:抽出的牌中有一个、两个大小王、没有大小王;抽出的牌中有对子。2、负面测试:输入的数组为空;输入数组的长度不等于 5。思路:我们可以把5张牌看成由5个数字组成的数组。大、小王是特殊的数字,我们不妨把...原创 2019-01-31 22:04:49 · 289 阅读 · 0 评论 -
剑指offer面试题52:两个链表的公共节点(Java实现)
题目:输入两个链表,找出它们的第一个公共结点。测试用例:1、功能测试:输入的两个链表有公共节点(第一个公共节点在链表头结点、中间、末尾);输入的两个链表没有公共节点。2、负面测试:输入的链表头结点为空。方法一:暴力法,时间复杂度为 O(mn)。思路:在第一链表上顺序遍历每个结点,每遍历到一个结点的时候,在第二个链表上顺序遍历每个结点。如果在第二个链表上有一个结点和第一个链...原创 2019-01-27 09:57:17 · 904 阅读 · 0 评论 -
剑指offer面试题53:在排序数组中查找数字(Java 实现)
题目:统计一个数字在排序数组中出现的次数. 例如输入排序数组{1,2,3,3,3,3,4,5},由于3在这个数中出现了4次,输出4。测试用例:1、功能测试:数组中包含或者不包含要查找的数字;要查找的数字出现一次或者多次。2、边界测试:查找数组中的最小值、最大值;数组中只有一个数字。3、负面测试:输入的数组为空。思路:利用二分查找法的变形分别找到第一个要找的值的下标和最后一个要找...原创 2019-01-27 11:38:45 · 425 阅读 · 0 评论 -
剑指offer面试题62:圆圈中最后剩下的数字(Java 实现)
题目:0, 1, … , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字。求出这个圈圈里剩下的最后一个数字。测试用例:1、输入的 m 小于 n;输入的 m 大于或者等于 n 。2、负面测试:圆圈中有 0 个数字方法一:经典的解法, 用环形链表模拟圆圈。 时间复杂度为 O(mn),空间复杂度为 O(n)。思路:创建一个总共有n 个结点的环形链表,然后每次在这...原创 2019-02-01 11:20:59 · 325 阅读 · 0 评论 -
剑指offer面试题63:股票的最大价值(Java 实现)
题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖交易该股票可能获得的利润是多少?例如一只股票在某些时间节点的价格为{9, 11, 8, 5, 7, 12, 16, 14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。测试用例:1、功能测试:输入股票价格数组无序、单调递增、单调递减。2、边界测试:输入的数组只有两个数字。3、负面测试:输入...原创 2019-02-01 14:16:07 · 343 阅读 · 0 评论 -
剑指offer面试题56:数组中数字出现的次数(Java 实现)
题目一:在一个数组中除了一个数字只出现一次之外,其他数字都出现了2次,请找出那个只出现了一次的数字。要求:线性时间复杂度O(N),空间复杂度为O(1)。思路:用异或运算来解决问题,由于两个相同的数字的异或结果是0,我们可以把数组中的所有数字进行异或操作,结果就是唯一出现的那个数字。public int FindANumAppearOnce(int[] array){ int ans...原创 2019-01-27 18:30:59 · 444 阅读 · 0 评论 -
剑指offer面试题57:和为 s 的数字(Java 实现)
题目一:和为 s 的两个数字。输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,则输入任意一对即可。测试用例:1、功能测试:数组中存在或者不存在两个和为 s 的数字。2、负面测试:输入的数组为空或者数字小于两个。 思路:因为数组是排序的,我们首先定义两个指针位于数组首尾两个数字,如果这两个数字加起来的和刚好是 sum ,...原创 2019-01-28 11:06:44 · 190 阅读 · 0 评论 -
剑指offer面试题64:求 1+2+...+n(Java 实现)
题目:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)测试用例:1、功能测试:输入 5、10 等 。2、边界测试:输入 0、1 。public class test_sixty_four { //方法一:利用库函数+位运算 public int Sum_Solution1(int n)...原创 2019-02-02 10:30:04 · 511 阅读 · 0 评论 -
剑指offer面试题65:不用加减乘除做加法(Java 实现)
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。测试用例:1、功能测试:分别输入负数、0 、正数 。思路:首先看十进制是怎样计算的: 5+17=22 第一步:相加各位的值,不算进位,得到12。第二步:计算进位值,得到10.。如果这一步的进位值为0,那么第一步得到的值就是最终结果。第三步:重复上述两步,只是相加的值变成上述两步的得到的结果 ...原创 2019-02-02 11:35:56 · 178 阅读 · 0 评论 -
剑指offer面试题66:构建乘积数组(Java 实现)
题目:给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1],不能使用除法。测试用例:1、功能测试:输入的数组包含正数、负数、0 ;2、负面测试:输入的数组为空或者长度小于2;方法一:直接连乘 n-1 个数字得到 B[ i ],时间复杂度为 O(n ²)。方法二:...原创 2019-02-03 10:50:44 · 208 阅读 · 0 评论 -
剑指offer面试题58:翻转字符串(Java 实现)
题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串为“I am a Student.",则输出为”Student. a am i" 。测试用例:1、功能测试:句子中只有一个或有多个单词。2、负面测试:输入的字符串为空;字符串只有空字符。思路:第一步反转句子中所有的字符。比如翻转“I am a Stude...原创 2019-01-30 10:12:29 · 399 阅读 · 0 评论 -
剑指offer面试题3:数组中重复的数字(Java 实现)
题目一:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。方法一:时间复杂度为O(n*nlogn),空间复杂度为O(1)先把输入的数组排序,排序一个长度为n的数组需要 O(nlo...原创 2019-02-21 16:40:29 · 478 阅读 · 0 评论 -
剑指offer面试题4:二维数组的查找(Java 实现)
首先选取数组中右上角的数组。1、如果该数字等于要查找的数字,则查找过程结束,返回true。2、如果该数字大于要查找的数字,则剔除掉这个数字所在的列。3、如果该数字小于要查找的数字,则剔除掉这个数字所在的行。直到找到数字,或者查找范围为空(row < array.length && column >= 0)。功能测试:1. 二维数组...原创 2019-02-21 19:16:51 · 182 阅读 · 0 评论 -
剑指offer面试题5:替换空格(Java 实现)
题目:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。测试用例:1. 功能测试:输入的字符串包含空格(最前面、中间、最后面、连续多个空格)2. 边界测试:输入的字符串没有空格。3. 负面测试:输入空指针(空字符串、只含一个空格字符、有多个空格字符)方法一:时间复杂度O(n²)...原创 2019-02-21 19:29:33 · 155 阅读 · 0 评论 -
剑指offer面试题2:实现 Singleton 模式(Java 实现)
题目:设计一个类,我们只能生成该类的一个实例。public class SingleObject { //创建 SingleObject 的一个对象 private static SingleObject instance = new SingleObject(); //设置类的构造函数为 private,保证该类不会被实例化 private SingleObject(){}...原创 2019-02-09 22:11:36 · 174 阅读 · 0 评论 -
剑指offer面试题59:队列的最大值(Java 实现)
题目:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1},{2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}...原创 2019-01-30 16:17:31 · 599 阅读 · 1 评论 -
剑指offer面试题6:从尾到头打印链表(Java实现)
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。思路:因为要实现从头到尾遍历,然后从尾到头打印,也就是说第一个遍历到的最后一个打印,最后遍历到的第一个打印,这很明显符合栈 “先进后出” 的特点,所以我们可以利用栈来实现这种顺序。测试用例:1. 功能测试:输入的链表有多个节点或只有一个节点。2. 负面测试:输入的链表头结点指针为空。代码实现有两种方式:借助栈实现,或使用...原创 2019-02-21 20:54:51 · 365 阅读 · 0 评论 -
剑指offer面试题7:重建二叉树(Java实现)
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:可以把二叉树分为左右子树分别构建,前序遍历数组的第一个元素即为二叉树的根节点,然后在中序遍历数组中按照根节点对应的元素把数组分为两部分,左边部分为二...原创 2019-02-21 21:13:15 · 263 阅读 · 0 评论 -
剑指offer面试题8:二叉树的下一个节点(Java 实现)
题目:给定一个二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了左右子节点外,还包含父节点。思路:节点分为有右子树和没有右子树两大类:1. 如果节点有右子树,那么它的下一个节点为它右子树的最左节点2. 如果节点没有右子树,也可以分为两类:(代码中可以统一处理) (a)它是父节点的左孩子,那么它的下一个节点就是它的父节点 (b)它是父节点...原创 2019-02-21 21:28:43 · 202 阅读 · 0 评论 -
剑指offer面试题9:用两个栈实现队列(Java 实现)
题目:用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。 队列中的元素为 int 类型。思路:首先定义两个栈 stack1 和 stack2 ,stack1 用来实现队列的 push 功能 ,stack2 用来缓冲实现队列的 pop 功能。测试用例:1. 功能测试:分别往空和非空的队列中添加和删除元素。2. 边界测试:连续删除元素直至队列为空。public c...原创 2019-02-21 21:59:44 · 267 阅读 · 0 评论 -
剑指offer面试题10:斐波那契数列(Java 实现)
思路:使用递归会重复计算,效率较低,可以用循环自下到上计算。基于循环:时间复杂度为O(n)测试用例:1. 功能测试:输入3、5、10 等。2. 边界测试:输入0、1、23. 性能测试:输入较大的数(如40、50、100 等)。public class test_ten { public int fibonacci(int n){ int result = 0; in...原创 2019-02-21 22:47:37 · 159 阅读 · 0 评论 -
剑指offer面试题17:打印1到最大的n位数(Java 实现)
题目:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999。测试用例:1. 功能测试:输入1、2、3...2. 特殊测试:输入0、-1...方法一:找出最大的 n 位数,直接打印。//找出最大的n位数,直接打印 public void print1ToMaxOfNDigits_1(int n){ int numbe...原创 2019-02-28 19:47:24 · 380 阅读 · 0 评论 -
剑指offer面试题18:删除链表的节点(Java 实现)
题目一:O(1)时间删除链表节点。给定单向链表的头指针head和一个节点指针,定义一个函数在O(1)时间删除该节点。测试用例:1. 功能测试:从有多个节点的链表中分别删除头结点、中间节点、尾节点。2. 边界测试:从只有一个节点的链表中删除节点。3. 负面测试:输入的头结点为空;输入的要删除的节点为空。思路一:常规做法,时间复杂度为 O(n)直接从头到尾遍历找到要删除节点的前一...原创 2019-02-28 19:56:46 · 521 阅读 · 1 评论 -
剑指offer面试题19:正则表达式匹配(Java 实现)
题目:请实现一个函数用来匹配包括 '.' 和‘*’的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。测试用例:功能测试:模式字符里面包含普通字符、‘.’、‘*’;匹配或者不匹配。负面测...原创 2019-02-28 20:18:14 · 458 阅读 · 1 评论 -
剑指offer面试题21:调整数组顺序使奇数位于偶数前面(Java 实现)
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:按照冒泡排序的思想,从头到尾遍历数组,依次比较两个相邻的元素,如果前面的元素是偶数,后面一个元素是奇数,就交换这两个元素。测试用例:1. 功能测试:输入的数组中的奇数、偶数交替出现;输入的数组中所有偶数都出...原创 2019-02-28 20:20:05 · 158 阅读 · 0 评论 -
剑指offer面试题22:链表中倒数第k个节点(Java 实现)
题目:输入一个链表,输出该链表中倒数第k个结点。思路:定义一快一慢两个指针,快的指针先走到 k-1 的位置,然后从第 k 个位置开始,两个指针同时走,当快的指针走到最后一个位置的时候,慢指针所在的位置就是倒数第 k-1 的位置。测试用例:1. 功能测试:第k个节点位于链表的中间;第k个节点是链表的第一个节点;第k个节点是链表的最后一个节点。2. 负面测试:输入的链表头结点为空;链表的节...原创 2019-02-28 20:24:06 · 305 阅读 · 0 评论 -
剑指offer面试题23:链表中环的入口节点(Java 实现)
思路:首先第一步定义一快一慢的两个指针用来判断链表中是否存在环,如果链表中存在环,则两个指针最终会相遇,此时慢指针走过的节点正好等于环中节点的数目(两个指针不相遇的情况即链表中不存在环,直接返回 null);然后第二步把快指针移到头结点的位置,然后两个指针同时向前移到,两个指针再次相遇(肯定会相遇)的位置即为环入口节点的位置。测试用例:1. 功能测试:链表中包含或者不包含环;链表中有多个节点...原创 2019-02-28 20:31:43 · 173 阅读 · 0 评论 -
剑指offer面试题24:反转链表(Java 实现)
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点。链表结点如下:public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}思路:直接遍历链表中的节点,把当前节点的指针指向前一个...原创 2019-02-28 20:44:35 · 299 阅读 · 0 评论 -
剑指offer面试题25:合并两个排序的链表(Java 实现)
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。思路:分别遍历两个链表,每一个都比较两个链表的头结点,把小的那一个头结点放到一个新定义的链表中,因为每一个比较合并的过程都是一模一样的,所以可以使用递归来实现。这里要注意输入的链表为空的特殊情况。测试用例:1. 功能测试:输入的两个链表有多个节点;节点的值互不相同或者存在值相等的多个节点。2. 特殊测试...原创 2019-02-28 20:54:50 · 617 阅读 · 1 评论 -
剑指offer面试题11:旋转数组的最小数字(Java 实现)
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序(非递减数组)的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。方法一:直接遍历查找最小的元素,时间复杂度为O(n)public int minNumberInRo...原创 2019-02-25 20:46:18 · 203 阅读 · 0 评论 -
剑指offer面试题12:矩阵中的路径(Java实现)
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如a b c es f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,...原创 2019-02-26 09:50:58 · 229 阅读 · 0 评论 -
剑指offer面试题14:剪绳子(Java 实现)
题目:给你一根长度为 n 的绳子,请把绳子剪成 m 段 (m 和 n 都是整数,n > 1并且m > 1)每段绳子的长度记为 k[0],k[1],…,k[m].请问 k[0]k[1]…*k[m] 可能的最大乘积是多少?例如,当绳子的长度为8时,我们把它剪成长度分别为2,3,3的三段,此时得到的最大乘积是18.方法一:动态规划。时间复杂度为 O(n²),空间复杂度为 O(n)可以...原创 2019-02-26 10:29:55 · 238 阅读 · 0 评论 -
剑指offer面试题15:二进制中1的个数(Java 实现)
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。比如输入9,9的二进制表示是1001,1的个数是2,所以输出2。测试用例:1. 正数(包括边界值1、0x7FFFFFFF)2. 负数(包括边界值0x80000000、0xFFFFFFFF)3. 0方法一:常规解法,循环次数等于整数二进制的位数首先把 n 和1做与运算,判断最低位是不是为1,接着把1左移一位得到1...原创 2019-02-26 10:55:07 · 170 阅读 · 0 评论 -
剑指offer面试题16:数值的整数次方(Java 实现)
题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。思路:本题主要考察的是需要考虑的情况比较多:1. 指数为负数,底数为0,无意义(在Java中可以选择抛出异常)2. 指数为0,返回13. 指数为正数(base,exponent)4. 指数为负数,底数不为0(1/b...原创 2019-02-26 11:14:25 · 237 阅读 · 0 评论 -
剑指offer面试题26:树的子结构(Java 实现)
题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:先通过遍历A树找到与B树根节点相等的节点(先拿A树的根节点比较,不匹配的话再利用递归思想拿A树根节点的左孩子和右孩子进行比较)。如果B树的根节点和A树中所有节点都不匹配的话就直接返回 false;如果B树的根节点在A树中有匹配的话再调用另外一个函数来分别比较匹配后的根节点的左子树和右子...原创 2019-03-02 21:13:43 · 236 阅读 · 0 评论 -
剑指offer面试题27:二叉树的镜像(Java 实现)
题目:给出一棵二叉树,求它的镜像,如下图:右边是二叉树是左边二叉树的镜像。思路:本题只要遍历树中的每一个节点,然后交换每一个节点的左右子节点就可以了,因为对每一个节点来说交换左右子节点这个过程都是一模一样的,所以可以采用递归的方式来进行操作。测试用例:1. 功能测试:普通二叉树;只有一个节点的二叉树;二叉树的所有节点都没有左子树或者右子树。2. 特殊测试:输入二叉树的根节点为空。...原创 2019-03-02 21:27:59 · 329 阅读 · 0 评论 -
剑指offer面试题28:对称的二叉树(Java 实现)
题目:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:二叉树是否对称,只要采用前序、中序、后序、层次遍历等任何一种遍历方法,分为先左后右和先右后左两种方法,只要两次结果相等就说明这棵树是一颗对称二叉树。所以我们可以通过比较二叉树的前序遍历序列和对称前序遍历序列来判断二叉树是不是对称的。要注意在遍历的过程中要把空指针也考...原创 2019-03-02 21:33:55 · 359 阅读 · 0 评论 -
剑指offer面试题29:顺时针打印矩阵(Java 实现)
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路:可以把矩阵看成是由外圈内圈这样一圈圈组成的,打印第一圈的左上角坐标为(0,0),打印第二圈的左上角坐标为(1,1),依次类推为(start,start)。然后我们可以构造一个函数来打印最外...原创 2019-03-02 21:49:55 · 341 阅读 · 0 评论 -
剑指offer面试题30:包含min函数的栈
题目:设计包含min 函数的栈。定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。 要求函数min、push 以及pop 的时间复杂度都是O(1)。思路:定义两个栈,一个用来储存数据,一个用来储存最小值。测试用例:新压入栈中的数字比之前的最小值大 新压入栈中的数字比之前的最小值小 弹出的数字不是最小元素 弹出的数字是最小元素public class tes...原创 2019-03-09 14:04:53 · 188 阅读 · 0 评论 -
剑指offer面试题31:栈的压入、弹出序列(Java 实现)
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、 2、 3、 4、 5是某栈的压栈序列,序列4、 5、 3、 2 、1是该压栈序列对应的一个弹出序列,但4、 3 、5 、1 、2就不可能是该压栈序列的弹出序列。思路:利用一个辅助栈来模拟出栈入栈的过程,首先按入栈序列把元素一个个压入栈中,每压入一个元素后判断栈顶...原创 2019-03-09 14:15:06 · 329 阅读 · 0 评论