剑指Offer
宁小葵
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
剑指Offer——把二叉树打印成多行
题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:同从上向下打印二叉树思路,但是需要添加两个变量记录当前层未打印节点和下一层需要打印的节点代码:import java.util.ArrayList;import java.util.Queue;import java.util.LinkedList;/*public class TreeNode {...原创 2019-08-12 16:51:12 · 200 阅读 · 0 评论 -
剑指Offer——数据流中的中位数
题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。定义:1、最大堆:当父节点的键值总是大于或等于任何一个子节点的键值时为最大堆。 2、最...原创 2019-07-22 17:40:20 · 156 阅读 · 0 评论 -
剑指Offer——最小的K个数
题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路一:利用快速排序的parition函数。如果基于数组的第K个数字来调整,则使得比第K个数字小的所有数字都位于数组的左边,比第K个数字大的所有数字都位于数组的右边,调整之后,位于数组中左边的K个数字就是最小的K个数字(这K个数字不一定是排序的,这只是快速排序的第一趟...原创 2019-07-22 15:42:37 · 204 阅读 · 0 评论 -
剑指Offer——和为S的两个数字
题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出任意一对即可。思路一:暴力破解。利用双重循环,以此扫描数组中的数字并求和,遇到和为S的便返回两个数字。时间复杂度为O(n^2);思路二:利用快速排序的思想;设置两个指针,指针P1从前向后遍历,第二个指针P2从后向前遍历;当两个指针指向的数字和等于S时,返回P1,P2指向...原创 2019-07-26 11:04:35 · 162 阅读 · 0 评论 -
剑指Offer——数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路:在遍历的时候保存两个值:一个是数组中的一个数字,一个是次数;当我们遍历到下一个数字时,如果和之前保存的数字相同,则次数+1; 如果和之前保存的不同,则次数-1; 如果...原创 2019-07-22 10:32:11 · 164 阅读 · 0 评论 -
剑指Offer——数组中只出现一次的数字
链接:https://www.nowcoder.com/questionTerminal/e02fdb54d7524710a7d664d082bb7811?f=discussion来源:牛客网-披萨大叔的回答题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:首先:位运算中异或的性质:两个相同数字异或=0,一个数和0异或还是它本身。...转载 2019-07-25 21:21:24 · 130 阅读 · 0 评论 -
剑指Offer——平衡二叉树
题目:输入一棵二叉树,判断该二叉树是否是平衡二叉树。定义:如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一颗平衡二叉树。思路一:递归重复遍历左右子树,类似于求二叉树的深度;见《剑指Offer——二叉树的深度》 此思路判断上层节点的时候,会多次重复下层节点,增加了不必要的开销;思路二:改为从下往上遍历,使用后续遍历左右根,遍历的时候记录左右子...原创 2019-07-25 20:22:00 · 150 阅读 · 0 评论 -
剑指Offer——二叉树的深度
题目:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:利用递归求二叉树的深度。如果一个二叉树只有一个节点,那么深度为1;如果根节点只有左子树没有右子树,那么树的深度应该为左子树的深度+1;如果根节点只有右子树没有左子树,那么树的深度应该为右子树的深度+1;如果根节点既有左子树,又有右子树,那么树的深度...原创 2019-07-25 17:30:42 · 148 阅读 · 0 评论 -
剑指Offer——二叉搜索树的第k个结点
题目:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路:利用二叉树的中序遍历,遍历到第K个节点时即可。代码:public class Solution{ private TreeNode ret; private int cnt = 0; public TreeNode...原创 2019-07-25 17:19:50 · 208 阅读 · 0 评论 -
剑指Offer——数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数。备注:思路一和思路二是一样的,思路二代码更加简洁。常见的思路是利用二分查找到一个K之后向两边扫描,如果有N个K的话时间复杂度就是O(n),不如下面的思路时间复杂度低。思路一:利用二分查找;查找第一个K的位置,查找最后一个K的位置,相减即可得到。时间复杂度为O(LogN)+O(LogN),所以总的时间复杂度为O(logN);代码:pub...原创 2019-07-25 16:48:59 · 226 阅读 · 0 评论 -
剑指Offer——两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点。思路一:1、先求出两个链表的长度差gap,让比较长的链表先向前遍历gap个节点,然后两个链表同时向前遍历,直到遇到相同的节点为止。时间复杂度:O(m+n);m和n分别为两个链表的长度。/** * 解法一:求得两个链表的长度差d,让较长的链表先走d步,然后两个链表再一起遍历,时间复杂度O(m+n) * @param pH...原创 2019-07-25 16:08:06 · 243 阅读 · 0 评论 -
剑指Offer——数组中的逆序对
题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007;思路一:扫描整个数组,没扫描到一个数字就和他后面的数字比较大小;如果后面的数字比它小,则这两个数字就组成一个逆序对。时间复杂度为O(n^2);思路二:时间换空间1、例如数组{7,...原创 2019-07-25 14:50:38 · 206 阅读 · 0 评论 -
剑指Offer——在O(1)时间内删除链表节点
思路:1、我们要删除节点i,先把节点i的下一个节点j的内容复制到i,然后把i的指针指向节点j的下一个节点,因此删除节点j;等同于删除节点i;2、如果节点位于链表的尾部,那么只能从头节点开始遍历并删除3、如果只有一个节点时,删除节点之后,还需要把链表的头节点设置为null;时间复杂度分析:对于n-1个非尾节点而言,时间复杂度为O(1);对于尾结点而言,时间复杂度为O(n);...原创 2019-08-02 15:13:18 · 197 阅读 · 0 评论 -
剑指Offer——第一个只出现一次的字符
题目:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).思路一:逐个扫描字符串,对每一个字符依次比较后面是否有重复的。时间复杂度为O(n^2);思路二:使用哈希表,第一次扫描字符串,没扫到一个字符,就在哈希表中把对应项的次数+1;接下来扫描第二次时,就能从哈希表中得到该字符出现的...原创 2019-07-25 10:24:14 · 172 阅读 · 0 评论 -
剑指Offer——序列化二叉树
题目:请实现两个函数,分别用来序列化和反序列化二叉树思路:1、序列化时根据先序遍历将为空的存为任一符号,比如“$”,并且每个字符之间用“,”隔开; 2、反序列化时,根据先序序列构建二叉树。第一个节点为根节点,然后构建根节点的左右子树,以此构建直到字符串为空代码: /** * 序列化二叉树 * @param root...原创 2019-07-20 17:02:31 · 143 阅读 · 0 评论 -
剑指Offer——和为S的连续正数序列
题目:输入一个整数S,打印出所有和为s 的连续整数序列(至少含有两个数);例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以打印出3个连续序列1~5,4~6和7~8。思路:类似于和为S的两个数字的结题思路;可以设置两个指针,samll和big,初始时small指向1,big指向2;和(curSum)为从small到big的所有数字的和;如果和等于目标值,将sm...原创 2019-07-26 15:15:14 · 202 阅读 · 0 评论 -
剑指Offer——翻转单词顺序列
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内的字符的顺序不变。为了简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I";思路:可以通过两次翻转来实现翻转句子中所有的字符 翻转每个单词中的字符顺序实现的关键在于实现一个函数可以翻转字符串中的一段代码:public class Solution ...原创 2019-07-26 15:45:02 · 159 阅读 · 0 评论 -
剑指Offer——左旋转字符串
题目:字符串的左旋转操作是把字符串前面的若干个字符转义到字符串的尾部;请定义一个函数实现字符串左旋转操作的功能;比如,输入字符串"abcdefg"和数字2,该函数将返回坐旋转两位得到的结果"cdefgab";思路:类似于翻转单词顺序题目;将字符串从第N为开始分为两部分;翻转前n-1位; 翻转n-最后一位; 翻转整个字符串;代码:public class Solution { ...原创 2019-07-26 16:00:52 · 162 阅读 · 0 评论 -
剑指Offer——字符串的排列
题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。思路:看做一个递归问题;求所有可能出现在第一个位置的字符,即将第一个位置的字符依次和后面的每一个字符进行交换; 固定第一个字符,对后面的字符进行全排列。即对后面的字符进行递归;对于递归来说:终止条件就是只...原创 2019-08-14 10:55:58 · 215 阅读 · 0 评论 -
剑指Offer——打印从1到最大的N位数
题目:输入数字n,按照顺序打印出1-最大的n位数的十进制数,比如输入3,则打印1,2,3~一直到最大的3位数999;思路一:题目最大的陷阱,当我们按照10的你次方计算的时候,忽略了如果醉的数超出了int或long数据的范围该怎么处理;所以可以用字符串的操作来代替数学运算;新建一个长度为n的字符串数组,分为两步:在字符串上模拟加法 打印字符串优化思路:新建一个长度为n的字符串数组,在...原创 2019-08-02 11:22:28 · 210 阅读 · 0 评论 -
剑指Offer——二进制中1的个数
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。二进制的运算:移位:1、右移:m>>n:表示把m右移n位,最右边的n位将会被丢弃如果无符号:用0填充左边的N位,如果有符号:用符号填充左边的N位,正数为0,负数为12、左移:m<<n:将m左移n位,在左移N位的时候,左边的数值将会被丢弃,在右边补充0思路:共三种思路;思...原创 2019-08-01 20:53:46 · 154 阅读 · 0 评论 -
剑指Offer——剪绳子
题目:给你一根长度为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。思路一:动态规划;自底向上以此求出绳子为1,2,3,4.....最大的乘积,保存在一个数组中;计算后面乘积...原创 2019-08-01 20:26:02 · 231 阅读 · 0 评论 -
剑指Offer——字符流中第一个不重复的字符
原文链接:cyc2018.github.io题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。代码:import java.util.Queue;import java.util.LinkedList;public...转载 2019-07-27 15:51:14 · 225 阅读 · 0 评论 -
剑指Offer——把字符串转换成整数
原文链接:cyc2018.github.io题目:将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。代码:public int StrToInt(String str) { if (str == null || st...转载 2019-07-27 15:46:11 · 169 阅读 · 0 评论 -
剑指Offer——构建乘积数组
原文链接:cyc2018.github.io题目:给定一个数组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]。不能使用除法。代码:import java.util.ArrayList;public class Solution { public i...转载 2019-07-27 15:09:53 · 158 阅读 · 0 评论 -
剑指Offer——不用加减乘除做加法
原文链接:cyc2018.github.io题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:a ^ b 表示没有考虑进位的情况下两数的和,(a & b) << 1 就是进位。递归会终止的原因是 (a & b) << 1 最右边会多一个 0,那么继续递归,进位最右边的 0 会慢慢增多,最后进位会变为 0...转载 2019-07-27 15:06:34 · 170 阅读 · 0 评论 -
剑指Offer——求1+2+3+...+n
原文链接:cyc2018.github.io题目:求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路:使用递归解法最重要的是指定返回条件,但是本题无法直接使用 if 语句来指定返回条件。条件与 && 具有短路原则,即在第一个条件语句为 false 的情况下不会去执行第二个...转载 2019-07-27 15:01:19 · 190 阅读 · 0 评论 -
剑指Offer——扑克牌的顺子
题目:从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,大王和小王可以堪称任意数字。思路:1、统计数字中0的个数n 2、统计排序之后相邻数字之间的空缺总数m,如果m<=n,那么是顺子,否则不是 注意:如果非0数字重复出现,则 不是连续的。代码:import...原创 2019-07-27 14:42:53 · 179 阅读 · 0 评论 -
剑指Offer——滑动窗口的最大值
题目:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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-07-27 11:33:25 · 167 阅读 · 0 评论 -
剑指Offer——把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:可以看成是一个排序问题,在比较两个字符串 S1 和 S2 的大小时,应该比较的是 S1+S2 和 S2+S1 的大小,如果 S1+S2 < S2+S1,那么应该把 S1 排在前面,否则应该把 S2 排在...原创 2019-07-23 11:27:03 · 156 阅读 · 0 评论 -
剑指Offer——整数中1出现的次数
参考文章:https://www.cnblogs.com/xuanxufeng/p/6854105.html题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。思路:剑指Offer上用的字符串处理,但是力扣大佬已经可以用5行代码解决。思路:我们从一个5位的数字讲起,先考虑其百位...转载 2019-07-23 10:38:38 · 226 阅读 · 0 评论 -
剑指Offer——连续数组的最大和
题目:计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和思路:由下图可知,1、当数组和为负数时,可以摒弃前面数组之和,从当前数字开始计算。2、当遍历到数字为负数...原创 2019-07-22 20:25:09 · 159 阅读 · 0 评论 -
剑指Offer——二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:二叉搜索树的中序遍历为排序的。1、通过中序遍历递归查找每个节点的左子树和右子树。2、每一个节点的左结点为左子树的链表最后一个节点,右结点为右子树链表的第一个节点。3、返回链表的头结点代码如下:public static TreeNode pLas...原创 2019-07-20 16:28:45 · 122 阅读 · 0 评论 -
剑指Offer——丑数
题目:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。定义:一个数m是另一个数n的因子,是指n能被m整除,也就是n%m==0;根据丑数的定义,就是一个数能被2整除,就连续除以2;如果能被3整除,就连续除以3;如果能被5整除,就连续除以5;如果最后得到的是1,那么...原创 2019-07-24 21:43:12 · 147 阅读 · 0 评论 -
剑指Offer——链表中倒数第K个节点
题目:输入一个链表,输出该链表中倒数第k个结点。链表从1开始;思路:可以设置两个指针。第一个指针先走K-1步。从第k步开始两个指针同时向后移动,等到前指针到达尾节点的时候,后指针到达倒数第K个节点。注意点:功能测试点1、边界值的判断:1、当k为头结点;k为尾结点;2、k的节点数大于链表的长度;k为02、k为中间数字public ListNode FindKthToTail(L...原创 2019-07-01 21:44:19 · 208 阅读 · 0 评论 -
剑指Offer——调整数组顺序使奇数位于偶数前面
这个题牛客上和书上不太一样;书上没有要求奇数和偶数的相对位置不变,而是考的对于代码的解耦;其中思路一和思路二可以保证位置不改变思路三适合于位置改变的;思路一:使用冒泡排序。时间复杂度O(n^2),O(1);每次有偶数都放在最后一位; public void reOrderArray(int [] array) { int length = array.length...原创 2019-07-01 17:25:53 · 132 阅读 · 0 评论 -
剑指Offer——表示数值的字符串
原文地址:https://www.nowcoder.com/questionTerminal/6f8c901d091949a5837e24bb82a731f2作者:傻傻傻傻思路一:匹配模式:(A)(.B)(e|EC)或者(.B)(e|EC)其中A代表整数部分,B代表小数部分,C代表指数部分。A和C都可以‘+’或者‘—’开头的0~9的数位串,B也是0~9的数位串,但是前面不能有正负号...转载 2019-07-01 16:24:01 · 179 阅读 · 0 评论 -
剑指Offer——斐波那契数列
题目:现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。思路一:直接递归;存在性能缺陷,逐层计算的话需要重复的值很多。不得不说,自己的想法都已经被作者看透。我刚看到题目的时候,内心就想终于遇到一个简单的了,然后写下来递归的代码。。。。。。。思路二:可以先把前面的值保存下来,这样计算后面的值的时候就不会有冗余的值。根据f(0)和f(1)计算出f(2),...原创 2019-06-17 22:23:59 · 178 阅读 · 0 评论 -
剑指Offer——机器人的运动范围
思路:这是一个类似于深度优先遍历的问题。当其从(0,0)开始,准备进入坐标为(i,j)的格子时,通过检查坐标的位数来判断机器人是否能够进入;如果可以进入坐标为(i,j)的格子,再判断是够能够进入4个相邻的格子。利用回溯算法实现:public class MovingCount2 { public static int movingCount(int threshold, in...原创 2019-06-24 21:54:51 · 141 阅读 · 0 评论 -
剑指Offer——用两个栈实现队列
思路:一个栈作为入栈S1,一个栈作为出栈S2。1、当要入栈的时候,只要把元素全部入栈到S1。原因:S1中的元素为该元素之前入栈,只有S2为空的时候才向S2倒S1中的元素。2、当出栈的时候,需要把S1中的元素倒到S2中:如果S2为空了,就把S1中的元素全部移到S2中;如果S2不为空,则直接POP栈顶元素。实现代码如下:public class Solution { Stac...原创 2019-06-17 12:07:47 · 132 阅读 · 0 评论
分享