剑指offer
hxl0925
这个作者很懒,什么都没留下…
展开
-
剑指offer(39)平衡二叉树
/** * 题目:平衡二叉树。输入一棵二叉树,判断该二叉树是否是平衡二叉树。 * * @author hexiaoli 思路: * 剑指offer思路:使用后序遍历,遍历二叉树的每一个结点,在遍历某个结点之前已经遍历了它的左右子树,如果已经非平衡可以提前退出判断。 * 在遍历过程中,只需要记录每个结点的深度(深度等于它到叶结点的路径的长度),便可以在遍...原创 2019-07-12 11:03:15 · 73 阅读 · 0 评论 -
剑指offer书(46)-1:最长不含重复字符的子字符串
/** * 题目:最长不含重复字符的子字符串. 字符串中只包含a-z.如arabcacfr中是acfr,长度为 4。 * @author hexiaoli * 思路:剑指offer 动态规划法:定义函数F(i)为:以第i个字符为结尾的不含重复字符的子字符串的最大长度。 *(1)当第i个字符之前未出现过,则有:F(i)=F(i-1)+1 *(2)当第i个字符之前出现过,记该字符与上次...原创 2019-07-10 10:04:12 · 104 阅读 · 0 评论 -
剑指offer(40)数组中只出现一次的两个数字
/** * 题目:数组中数字出现的次数。数组中只出现一次的两个数字,要求空间o(1)时间o(n). eg:{2,4,3,6,3,2,5,5}结果是4、6 * 思路:剑指offer 异或思想,任何数和它本身异或的值为0. * 我们依旧从头到尾异或每个数字,那么最终的结果就是这两个只出现一次的数字的异或结果,由于两个数不同,因此这个结果数字中一定有一位为1,把结果中第一个1的位置记为第n位。...原创 2019-07-12 18:26:37 · 80 阅读 · 0 评论 -
剑指offer书(56)-3:数组中唯一只出现一次的数字
/** * 题目:数组中数字出现的次数。数组中唯一只出现一次的数字,其他都是3次。 eg:{2,2,4,2}结果是4. 思路:剑指offer 位运算 * 如果一个数字出现三次,那么它对应的二进制表示的每一位都出现了三次。 将数组中所有数字的二进制表示的每一位都加起来,如果某位数的和不能被3整除,则找到。 * * @author hexiaoli */public class Mai...原创 2019-07-12 19:14:06 · 147 阅读 · 0 评论 -
剑指offer(42)和为S的两个数字
package project;import java.util.ArrayList;import java.util.Iterator;/** * 题目:和为S的两个数字。如果有多对,输出一对就好 eg:{1,2,4,7,11,15} 和位15,则是4,11 * 思路:剑指offer设置数组首尾两个指针。如果两个所指数字之和小于目标值,则首指针向后移动,反之尾指针向前移动。 ...原创 2019-07-12 23:00:44 · 81 阅读 · 0 评论 -
剑指offer(41)和为S的连续正数序列
package project;import java.util.ArrayList;/** * 题目:和为S的连续正数序列。求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。 * 没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。你能不能也很快的找出所有和为S的连续正...原创 2019-07-12 23:46:24 · 83 阅读 · 0 评论 -
剑指offer(43)左旋转字符串
/** * 题目:左旋转字符串。 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。 * 对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。 * 例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。 思路:剑指offer * 1)可以简单理解为:在要求的位置分成两个字符串,再将左...原创 2019-07-13 16:09:24 · 99 阅读 · 0 评论 -
剑指offer(64)滑动窗口的最大值
import java.util.ArrayDeque;import java.util.ArrayList;/** * 题目:滑动窗口的最大值。 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。 * 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; * 针对数组{2,3,4...原创 2019-07-13 19:59:21 · 71 阅读 · 0 评论 -
剑指offer书(56)-2:队列中的最大值
import java.util.ArrayDeque;/** * 题目:队列中的最大值。请定义一个队列并实现函数max得到队列里的最大值,要求函数max、push_back和pop_front的时间复杂度都是O(1)。 * 思路:剑指offer * 与滑动窗口的最大值一题相似,利用一个双端队列来存储当前队列里的最大值以及之后可能的最大值。 * 在定义题目要求功能的队列时,除了定义一...原创 2019-07-13 21:12:25 · 132 阅读 · 0 评论 -
剑指offer书(47)礼物的最大价值
/** * 题目:礼物的最大价值。m*n大小的矩阵中放着价值>0的物品, * 从左上角走到左下角,每次只能向下或者向右走。 * @author hexiaoli * 思路:剑指offer eg:从右到左翻译并计算不同翻译的数目,解除重复子问题。 */public class Main { public static int getMaxValue(int[][] val...原创 2019-07-09 10:27:46 · 166 阅读 · 0 评论 -
剑指offer书(46)-2:数字翻译成字符串
/** * 题目:把数字翻译成字符串。 * 0翻译成a..25翻译成z。 如12258有5种翻译方法分别是bccfi,bwfi,bczi,mfi,mzi * * @author hexiaoli * 思路:剑指offer eg:从右到左翻译并计算不同翻译的数目,解除重复子问题。 */public class Main { public static int getTran...原创 2019-07-09 09:14:01 · 113 阅读 · 0 评论 -
剑指offer(27)字符串的排列
package java_jianzhioffer_algorithm;import java.util.ArrayList;import java.util.Collections;/** * 题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。 * 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串 * abc,acb,bac,bca,cab和c...原创 2019-05-28 15:41:33 · 90 阅读 · 0 评论 -
剑指offer(28)数组中出现次数超过一半的数字
import java.util.Arrays;/** * 题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 * 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。 * 由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0 * @author hexiaoli * 思路: * 1)对数组进行排序,如果其中有一个数字出现...原创 2019-07-08 09:44:38 · 112 阅读 · 0 评论 -
剑指offer(29)最小的K个数
import java.util.ArrayList;import java.util.Arrays;import java.util.Iterator;import java.util.TreeSet;import javax.naming.spi.DirStateFactory.Result;/** * 题目:输入n个整数,找出其中最小的K个数。 例如输入4,5,1,6,2,7...原创 2019-07-08 10:29:32 · 82 阅读 · 0 评论 -
剑指offer(63)数据流中的中位数
import java.util.PriorityQueue;import java.util.Comparator;/** * 题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。 * 如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 * 我们使用Insert()方法读取数据流,使用GetMe...原创 2019-07-08 15:22:24 · 87 阅读 · 0 评论 -
剑指offer(30)连续子数组的最大和
/** * 题目:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。 * 但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢? * 例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。 * 给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是...原创 2019-07-08 15:52:29 · 105 阅读 · 0 评论 -
剑指offer(31)1-n整数中1出现的次数
/** * 题目:输入一个整数n,求1-n中10进制表示中1次数。 * 如输入12:1、10、11、12出现4次 * @author hexiaoli * 思路: * 1)转化为字符串,统计1出现次数 */public class Main{ public static int NumberOf1Between1AndN_Solution(int n) { if(n&...原创 2019-07-08 16:07:47 · 123 阅读 · 0 评论 -
剑指offer书(44)数字序列中某一位的数字
/** * 题目:数字序列中某一位的数字 * 如输入0123456789101112131415...格式化到一个字符序列中,第五位是5,第13位是1. *请写一个函数,求任意第n位对应的数字 * @author hexiaoli * 思路:剑指offer * eg:第1001位 1)1位数的数值有10个:0~9,数字为10×1=10个,显然1001>10,跳过这10...原创 2019-07-08 17:19:49 · 115 阅读 · 0 评论 -
剑指offer(32)把数组排成最小的数
import java.util.ArrayList;import java.util.Comparator;/** * 题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 * 例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 * @author hexiaoli * 思路:剑指offer * e...原创 2019-07-08 17:40:39 · 70 阅读 · 0 评论 -
剑指offer书(60)n个骰子的点数
/** * 题目:n个骰子的点数(Java实现)。把n个骰子仍在地上,所有骰子朝上一面的点数之和为s。 输入n,打印出s的所有可能的值出现的概率。 * 思考:剑指offer 所有的结果应该只有6n-n+1=5n+1种。 * 用两个数组来存储骰子点数的每一个总出现的次数。在首次循环中,每一个数组中的第n个数字表示骰子和为n出现的次数。 * 在下一轮循环中,再新加入一个新的骰子,此时和为n...原创 2019-07-14 15:17:50 · 142 阅读 · 0 评论 -
剑指offer(45)扑克牌顺子
/** * 题目:扑克牌顺子(Java实现)。随机从中抽出了5张牌,决定大\小 王可以看成任何数字,并且A看作10,J为11,Q为12,K为13。 * 如果牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。 * 思考:剑指offer * 提取主要信息,顺子必须满足如下条件: * 1)输入数据个数为5; * 2)输入数据都在0~13之间; * ...原创 2019-07-14 15:46:52 · 84 阅读 · 0 评论 -
剑指offer(35)数组中的逆序对
/** * 题目:数组中的逆序对。 * 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。 * 输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 * 即输出P%1000000007。例如输入{1,2,3,4,5,0},输出5对。 * 并返回它的位置,如果没有则返回 -1(需要区分大小写)。 * @author ...原创 2019-07-10 19:35:25 · 76 阅读 · 0 评论 -
剑指offer(36)两个链表的第一个公共结点
import java.util.HashMap;/** * 题目:两个链表的第一个公共结点 * 输入两个链表,找出它们的第一个公共结点。(PS:公共结点之后的结点均相同) * @author hexiaoli * 思路:剑指offer * 1)借助栈的思想,先进后出,直到找到最后一个相同的节点。长度不一样的话,遍历求两个长度,长的比短的先走长度差个长度。 * 2)大神思想: 作...原创 2019-07-10 20:23:28 · 84 阅读 · 0 评论 -
剑指offer(37)数字在排序数组中出现的次数
/** * 题目:数字在排序数组中出现的次数 如输入{1,2,3,3,3,3,4,5},3出现次数为4. * * @author hexiaoli 思路:剑指offer 1)遍历 * 2)利用二分查找法,先拿中间数字和k比较,如果中间数字<k说明在右半部分,如果中间数字>k说明在左半部分 * 如果相等,需要需要向左向右判断相邻的数字是不是k...原创 2019-07-11 09:21:38 · 75 阅读 · 0 评论 -
剑指offer书(53)-2:0-n-1中缺失的数字
package project;/** * 题目:0-n-1中缺失的数字。数组是递增数组,所有数字唯一一个。 0-n-1有且只有一个数字不在该数组。 * * @author hexiaoli * 思路:剑指offer 思路: 1)求0-n-1的和,再求实际数组中0-n-1的和,做差就好了。 *2)二分法。如果中间元素值和下标相等,那么下一轮只需要查找右半边,如果不等且前一个元素...原创 2019-07-11 21:25:43 · 140 阅读 · 0 评论 -
剑指offer书(53)-3:数组中数值和下标相等的元素
package project;/** * 题目:数组中数值和下标相等的元素。 * eg:{-5,-3,0,3,5},数字3和它的下标相等 * @author hexiaoli * 思路:剑指offer * 1)二分法。假设数字的值位m,若m>index,则在左边,否则在右边。 */public class Main { public static int ...原创 2019-07-11 22:44:38 · 136 阅读 · 0 评论 -
剑指offer(62)二叉搜索树的第k个结点
package project;/** * 题目:二叉搜索树的第k个结点。 * 给定一棵二叉搜索树,请找出其中的第k小的结点。 * 例如(5,3,7,2,4,6,8)中,按结点数值大小顺序第三小结点的值为4。 * @author hexiaoli * 思路:剑指offer *二叉搜索树:左子结点的值 < 根结点的值 < 右子结点的值。二叉搜索树中序遍历序列为递增...原创 2019-07-11 23:35:04 · 85 阅读 · 0 评论 -
剑指offer(38)二叉树的深度
/** * 题目:二叉树的深度。 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 * * @author hexiaoli 思路:剑指offer 思路: 1)递归方法,使用DFS(深度优先搜索)。 */class TreeNode { int val; TreeNode left = null; Tree...原创 2019-07-12 10:38:18 · 72 阅读 · 0 评论 -
剑指offer(54)字符流中第一个不重复的字符
import java.util.*;import java.util.stream.Stream;/** * 题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。 * 例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。 * 当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 * 如果当前字符流没有存在出现一次的字符,...原创 2019-07-14 20:11:16 · 102 阅读 · 0 评论 -
剑指offer(49)把字符串转换成整数
/** * 题目:把字符串转换成整数。 eg:+2147483647 1a33 返回:2147483647 0 * * @author hexiaoli */public class Main { public static boolean flag; public static int StrToInt(String str) { flag = false;// 判断输...原创 2019-07-14 19:57:19 · 157 阅读 · 0 评论 -
剑指offer书(63) 股票的最大利润
/** * 题目:股票的最大利润(Java实现)。假设把某股票的价格按照时间先后顺序存储在数组中, 请问买卖交易该股票可能获得的利润是多少? * 例如一只股票在某些时间节点的价格为{9, 11, 8, 5,7, 12, 16, 14}。 * 如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。 思考:剑指offer * 。遍历每一个数字,并保存之前最小的数字,两...原创 2019-07-14 16:22:27 · 205 阅读 · 1 评论 -
剑指offer(47)求1+2+3+...+n
/** * 题目:求1+2+3+...+n。 * 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 * 思考:剑指offer。 1)需利用逻辑与的短路特性实现递归终止。 * 当n==0时,(n>0)&&((sum+=Sum_Solution(n-1))>0)只执行前...原创 2019-07-14 16:30:43 · 98 阅读 · 0 评论 -
剑指offer(48)不用加减乘除做加法
/** * 题目:不用加减乘除做加法.写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 * 思考:剑指offer。 1)直接使用Integer类的sum()方法。 * 2)用异或运算。第一步计算异或和,第二步按位与后左移一位操作 直到没有进位后输出结果,否则一直重复第一第二步 * eg:14(1110)+7(0111) * 第一次:1001,11...原创 2019-07-14 17:04:27 · 79 阅读 · 0 评论 -
剑指offer(51)构建乘积数组
/** * 题目:构建乘积数组。 * 给定一个数组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]。不能使用除法。 * 思考:剑指offer。 观察公式,B[i]公式中没有A[i]项,直观解法是连乘n-1个数字得到B[i],但该方法时间复杂度为O(n^2)。 * 更高效算法可以...原创 2019-07-14 19:09:14 · 95 阅读 · 0 评论 -
剑指offer(33)丑数
/** * 题目:把只包含质因子2、3和5的数称作丑数(Ugly Number)。 * 例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。 * @author hexiaoli * 思路:剑指offer * 根据丑数的定义,丑数只能被2、3和5整除。因此一个丑数是另一个丑数乘以2、3或者5的结果(1除外)。 * ...原创 2019-07-10 15:28:08 · 100 阅读 · 0 评论 -
剑指offer(34)第一个只出现一次的字符
import java.util.HashMap;/** * 题目:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符, * 并返回它的位置,如果没有则返回 -1(需要区分大小写)。 * @author hexiaoli * 思路:剑指offer * 建立一个哈希表,第一次遍历字符串,统计每个字符的出现次数。第二次遍历字符串,...原创 2019-07-10 15:57:14 · 75 阅读 · 0 评论 -
剑指offer(23)二叉搜索树的后序遍历序列
/** * 题目:二叉搜索树的后序遍历序列。 * 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。 * 如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 * @author hexiaoli */public class Main { public static boolean verifySquenceOfBST(int[] s...原创 2019-07-14 19:33:25 · 76 阅读 · 0 评论 -
剑指offer(46)孩子们的游戏(圆圈中最后剩下的数)
/** * 题目:孩子们的游戏(圆圈中最后剩下的数) 然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列,直到剩下最后一人。 * 思考: 1)F(N,M)=(F(N-1,M)+M)%N 2)链表 3)数组 * * @author hexiaoli */class Node { Node next = null; int val; pub...原创 2019-07-14 19:51:58 · 104 阅读 · 0 评论 -
剑指offer(61)序列化二叉树
package java_jianzhioffer_algorithm;/** * 题目:请实现两个函数,分别用来序列化和反序列化二叉树 * @author hexiaoli * 思考: * 1)序列化,节点为空用“#,”表示,采用先序遍历 * 2)反序列化,用字符串进行划分 */class TreeNodesd { int val = 0; Tree...原创 2019-05-28 09:51:08 · 79 阅读 · 0 评论 -
剑指offer(24)二叉树中和为某一值的路径
package java_jianzhioffer_algorithm;/** * 题目:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。 * 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 * (注意: 在返回值的list中,数组长度大的数组靠前) * @author hexiaoli * 思考:深度优先搜索。使用前序遍历,定义...原创 2019-05-17 14:12:06 · 71 阅读 · 0 评论