剑指offer
文章平均质量分 59
zjxxyz123
这个作者很懒,什么都没留下…
展开
-
剑指offer-丑数
题目描述把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。地址: 牛客链接问题分析该题和leetcode一题相同,见 Leetcode-264. Ugly Number II...原创 2018-03-30 00:31:35 · 184 阅读 · 0 评论 -
剑指offer-替换空格
题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。地址:牛客链接代码实现public class Solution { public String replaceSpace(StringBuffer str) { String s = s...原创 2018-03-20 18:26:07 · 140 阅读 · 0 评论 -
剑指offer-二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。地址:牛客链接解决方法:方法1:因为输入可能是负数,所以利用 >>> 逻辑右移 符号,来使每一位与 1 进行位与,若结果为1,则count++,直至n右移变为0方法2:利用一个 int 类型的辅助值 temp,初始值为1。来和n进行位于,若结果不为0,说明n的二进制当前位置上为1,c...原创 2018-03-20 21:57:15 · 179 阅读 · 0 评论 -
剑指offer-数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。地址:牛客链接解决方法这是一道极其经典的位运算题目首先,这是一个有很多特殊情况的题: 指数为0时,直接返回1底为0,但是指数为负数时,发生除0异常,指数为正数时,返回0;其他情况(使用以下三种方法)方法1:判断完边界条件后,直接循环,若指数绝对值大...原创 2018-03-21 19:35:12 · 275 阅读 · 0 评论 -
剑指offer-调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。地址: 牛客链接解题方法如果能用额外空间的话,那么遍历一遍原数组,奇数从左向右放,偶数从右向左放入辅助数组,然后再从辅助数组拷贝到原数组。 时间复杂度:O(N) 空间复杂度:O(N)...原创 2018-03-22 09:54:57 · 233 阅读 · 0 评论 -
剑指offer·-链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。地址:牛客链接解题方法方法一:因为是单链表,如果链表长度为 size ,如果要找链表中倒数第k个结点,相当于找链表中第 size - k + 1 个结点 首先遍历链表,得到链表长度 size然后看 k 是否大于 size,若是则直接返回 null从头开始,找到第第 size - k + 1 个结点,返回方法二:利用快...原创 2018-03-22 17:52:48 · 152 阅读 · 0 评论 -
剑指offer-树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)地址: 牛客链接解题方法分以下三种情况考虑:以下三种情况满足一个 B 便是 A 的子结构考虑从根节点开始(必须使用A的根节点),B是A的子结构 B是A的左子树的子结构(递归)B是A的右子树的子结构(递归)base case 若A是空树,则B不是A的子结构若B是...原创 2018-03-22 21:07:33 · 126 阅读 · 0 评论 -
剑指offer-顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.地址: 牛客链接解题方法采用逐圈打印矩形的方式来打印出整个矩阵那么如何确定一个矩形? 如果是矩形,可以用...原创 2018-03-23 20:18:31 · 308 阅读 · 0 评论 -
剑指offer-包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。地址: 牛客地址解题方法用两个栈实现该功能,dataStack用于存储数据,minStack用于栈顶维持数组最小值当入栈时,dataStack正常入栈,minStack只有为空或者当前元素小于等于栈顶元素时才将当前元素入栈当出栈时,dataStack正常出栈,只有当前出栈元素等于minStac...原创 2018-03-24 09:00:15 · 163 阅读 · 0 评论 -
剑指offer-从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。地址: 牛客链接问题分析很明显,这是层次遍历。层次遍历要用一个队列来辅助实现,若根节点不为空,先将根入队。然后将队中第一个节点出队,并将该节点的左右孩子依次入队(如果左右孩子不为空)。重复上述操作,直至队列为空,完成层次遍历。经验教训层次遍历要用队列在java中,队列可用LinkedList来...原创 2018-03-24 09:57:10 · 131 阅读 · 0 评论 -
剑指offer-二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。地址: 牛客链接问题分析因为后序遍历是 “左右根”的形式,所以若是后序遍历序列,那么数组末尾一定是根二叉搜索树的特点是 左子树中的所有元素都小于根,右子树的所有元素都大于根,那么它的后序序列数组便满足,前一部分都小于末尾元素,后...原创 2018-03-24 15:23:23 · 159 阅读 · 0 评论 -
剑指offer-二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。地址: 牛客地址题目分析这是一道DFS题目,也可以看做是先序遍历的题目 ,在二叉树中,dfs就相当于先序遍历首先,采用一种“减法”思想,当检查一棵树从根到叶子节点形成的路径的和是否为target时,先将当前根节点的值 root...原创 2018-03-26 16:10:22 · 7032 阅读 · 5 评论 -
剑指offer-复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)地址: 牛客链接题目分析链表题,两大解题方向:是否用额外空间方法1:用额外空间 用map来实现复杂链表的复制,key存储原链表中节点,value存储拷...原创 2018-03-26 20:07:57 · 251 阅读 · 0 评论 -
剑指offer-字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。地址:牛客链接题目分析这是一道经典的DFS题目,利用回溯的思想找到一个字符数组的全排列,并完成去重与字典序排序操作。大致思想便是,先确定第i个字符(从i到最后完成遍历枚举),然后对i+1-N-...原创 2018-03-27 10:32:34 · 4377 阅读 · 0 评论 -
剑指offer-数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。地址: 牛客链接问题分析方法1:看到该题时的第一想法是遍历数组用 HashMap 来统计个数,若统计过程中发现有个数超过一半的元素,则直接返回。若遍历结束,依...原创 2018-03-27 15:42:15 · 310 阅读 · 0 评论 -
剑指offer-重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。地址:牛客链接解决方法:首先明确前序遍历是 根左右 ,中序遍历 是 左根右。以前序遍历序列{1,2,4,7,3,5,6,8}和中序...原创 2018-03-20 17:41:21 · 303 阅读 · 0 评论 -
剑指offer-从尾到头打印链表
题目描述输入一个链表,从尾到头打印链表每个节点的值。地址:牛客链接解决方法个人认为这是一个非常*的题,最后竟然让你返回一个list方法一:利用栈 LIFO 的特点,先遍历链表,存入栈,然后弹栈进入list,即完成反转。但是这样用到了额外空间。方法二:递归。先反转当前节点之后的元素,将反转后的存入list(这便是递归调用),然后将当前节点的加入list中。方法三:在原链...原创 2018-03-20 15:21:56 · 131 阅读 · 0 评论 -
剑指offer-二维数组中的查找
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。地址:牛客链接解决方法方法1:遍历整个二维数组,O(M*N)的时间复杂度,显然是不得分的答案方法2:注意题干,每一行与每一列都是排好序的,看到排序与查找这两个字眼,自然想到二分查找,可以外层循环遍历行...原创 2018-03-20 10:48:36 · 220 阅读 · 0 评论 -
剑指offer-二叉搜索树与双向链表
题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。牛客链接问题分析:一般涉及到二叉树的问题,大部分都有个大套路,便是递归处理左右子树,以此缩小问题规模,此题也一样。因为是二叉搜索树,所以其中序遍历的结果应该是从小到大排序的。解法主要有两个大方向,一是用额外容器(方法一),二是不用额外容器(方法2)...原创 2018-01-23 16:33:38 · 238 阅读 · 0 评论 -
剑指offer-平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。牛客链接解题思路这是一道关于二叉树经典套路问题,因为二叉树本身就是用递归定义的,所以关于二叉树的一些算法题大部分可用递归解。大致思路便是:根据题意,写一个递归函数,函数内部对左子树递归,收集信息,对右子树递归,收集信息,然后根据题意将左右子树信息整合,返回该树的信息,这也有点 分治 的思想在里面。要求该树是平衡二叉树,...原创 2018-02-28 10:26:10 · 203 阅读 · 0 评论 -
剑指offer-二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。牛客链接题目分析二叉树经典套路问题:递归代码实现import java.util.*;/**public class TreeNode { int val = 0; TreeNode left = null;...原创 2018-03-11 23:49:21 · 145 阅读 · 0 评论 -
剑指offer-连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的...原创 2018-03-12 08:40:28 · 195 阅读 · 0 评论 -
剑指offer-和为S的两个数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述: 对应每个测试案例,输出两个数,小的先输出。地址:牛客链接解决方法:这一题和 leetcode 中的 Two Sum II - Input array is sorted 类似,只不过这道题可能会存在多对数字的和等于S,要求输...原创 2018-03-16 17:10:10 · 192 阅读 · 0 评论 -
剑指offer-二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \...原创 2018-03-16 17:30:50 · 154 阅读 · 0 评论 -
剑指offer-斐波那契数列
题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39地址:牛客地址解决方法这是个很好的例子,用来理解从递归到动态规划,再到动态规划的优化方法1:递归 利用公式 f(0) = 0, f(1) = 1; f(n) = f(n-1) + f(n-2), n >= 2时但是这样会造成重复计算,当n比较大时引发栈溢出。例...原创 2018-03-16 21:26:08 · 160 阅读 · 0 评论 -
剑指offer-跳台阶
问题描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法地址:牛客链接解决方法:用f(n)表示要跳到第n级台阶的跳法,那么如果要跳到第n级台阶,可以从第n-1级台阶跳11级到第n级,也可以从第n-2级台阶跳2级到第n级。所以 f(n) = f(n-2) + f(n-1)根据规律可以发现,这类似于斐波那契数列,初始条件 f(0) = ...原创 2018-03-16 21:56:02 · 293 阅读 · 0 评论 -
剑指offer-变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。地址:牛客链接解决方法此题目是跳台阶的变形。 同样,用 f(n) 表示 跳上n级的台阶的总跳法,那么青蛙可以从第0级,第1级,第2级…第n-1级直接跳到第n级,所以 f(n)=f(0)+f(1)+f(2)+...+f(n−1)f(n)=f(0)+f(1)+...原创 2018-03-17 10:12:33 · 141 阅读 · 0 评论 -
剑指offer-反转链表
题目描述输入一个链表,反转链表后,输出链表的所有元素地址:牛客链接解决方法这是道最简单的链表调整题,对于链表调整题,一般两种做法: 不用额外空间,直接调整next指针(一般面试中回答这种方法)采用额外空间,例如新建链表或者用集合或栈存储,处理后再将集合内的元素串成一条链表(笔试中,不会上一种方法,可以采用这种)针对该题,具体有三种做法: 在原链表上调整 从第一个节...原创 2018-03-17 16:19:33 · 184 阅读 · 0 评论 -
剑指offer-合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。地址:牛客链接解决方法关于链表调整的两大方向,见反转链表本题目解法有二: 直接链表调整(循环),和合并两个有序数组差不多思想递归调整代码实现:/*public class ListNode { int val; ListNode ne...原创 2018-03-17 17:41:47 · 141 阅读 · 0 评论 -
剑指offer-矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?地址:牛客链接解决方法一个归纳总结题:如何找递归关系用 f(n) 表示 用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法,那么当 n = 1时,只有一种方法,那便是竖着放,所以 f(1) = 1; 当 n = 2时,有...原创 2018-03-17 21:38:31 · 208 阅读 · 0 评论 -
剑指offer-栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解决方法采用一个辅助栈来模拟栈的入栈,出栈操作,用 i 与 j 来标记入...原创 2018-03-18 21:33:00 · 153 阅读 · 0 评论 -
剑指offer-旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。地址:牛客链接解决方法初看这道题,一次遍历找到最小值即可,O(N);当然,如果你对面试官说...原创 2018-03-19 21:53:47 · 179 阅读 · 0 评论 -
剑指offer-最小的K个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。地址: 牛客地址问题分析方法1:对数组先排序,然后取前K个数。时间复杂度:O(NlogN)方法2:利用冒泡排序每一趟都能找到最小的元素,然后走K趟便能找到最小的K个数。时间复杂度: O(K*N)方法3:建立一个容量为K的大根堆,先将数组的前K...原创 2018-03-28 15:24:48 · 191 阅读 · 0 评论 -
剑指offer-整数中1出现的次数(从1到n整数中1出现的次数)
题目描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。地址:牛客链接题目分析笨方法:从1到n遍历,依次统计累加1的数目 时间复杂度:O(N...原创 2018-03-28 21:20:49 · 190 阅读 · 0 评论 -
剑指offer-链表中环的入口结点
题目描述一个链表中包含环,请找出该链表的环的入口结点。地址:牛客地址题目分析用额外空间: 遍历链表,用HashSet存储已遍历节点,假如遍历到curNode时,set中已经存在,说明这是入环节点,返回。若不存在,装入set中不用额外空间首先判断有没有环 用快慢指针,fast 与 slow,起初,都指向头结点,然后快指针走两步,慢指针走一步,直到快慢指针相遇,若是跳...原创 2018-04-04 21:46:51 · 148 阅读 · 0 评论 -
剑指offer-对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。地址:牛客地址问题分析若比较两棵树是否互为对称,必须同时满足以下三个条件 两树的根节点相同树1的左子树与树2的右子树互为对称(递归)树1的右子树与树2的左子树互为对称(递归)base case 见实现代码实现/*public cl...原创 2018-04-04 23:55:07 · 144 阅读 · 0 评论 -
剑指offer-把二叉树打印成多行
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。地址: 牛客地址问题分析这就是层次遍历,只不过要求区分层次那么如何区分层次呢? 初始想法是用 null 来区分每一层,作为每一层的结尾标志。遍历完一层便在队列中加一个null,以后该null出队时,判断此时队列是否为空,若为空,则说明已经遍历结束(下一层没有元素),若不为空,则在队列中加null。具...原创 2018-04-05 11:16:46 · 155 阅读 · 0 评论 -
剑指offer-二叉树的下一个节点
题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。地址:牛客地址问题分析这题实际考察的是对二叉树中序遍历的深入理解,以及画图,举例分析问题的能力首先,介绍笨办法 根据当前节点,找到根节点,然后中序遍历整棵二叉树,遍历中序序列,找到该节点的下一个节点 这种方法需要遍历整棵二叉树...原创 2018-04-05 15:16:13 · 151 阅读 · 0 评论 -
剑指offer-删除链表中重复的节点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5地址:牛客地址问题分析用额外空间: 用map统计次数,次数为1的串成一串不同额外空间,直接链表调整: 迭代法 首先设置新建一个头节点,原链表...原创 2018-04-06 10:06:04 · 161 阅读 · 0 评论 -
剑指offer-表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。地址:牛客链接问题分析就是一个边界考察题,具体看实现代码实现public class Solution...原创 2018-04-06 15:45:00 · 112 阅读 · 0 评论