- 博客(77)
- 收藏
- 关注
原创 Thrift请求丢失字段(记一次坑爹请求)
红黑树的定义:是一种自平衡二叉查找树。能够在插入和删除操作时保持二叉树的平衡,可以在O(logN)时间内做查找,删除、插入。红黑树的性质:1、节点是红色或者黑色2、根节点是黑色3、每个叶子节点都是黑色的空节点(null)3、每个红色节点的两个子节点都是黑色(从每个叶子到根的所有路径上不能有两个连续的红色节点)4、从任一节点到其叶子节点的所有路径包含相同数目的黑色节点。...
2021-07-30 19:58:59
417
原创 堆排序
public class HeapSort { private static void heapSort(int[] arr, int count) { //1.构建大顶堆 for(int i=arr.length/2-1;i>=0;i--){ //从第一个非叶子结点从下至上,从右至左调整结构 adju...
2019-10-11 22:00:55
211
原创 希尔排序
/** * @Author: AnNing * @Description: * @Date: Create in 10:48 2019/6/20 */public class ShellSort { /** * 希尔排序 * @param arr 待排数组 */ public static void shellSort(int[] arr)...
2019-10-11 22:00:13
178
原创 归并排序
/** * 归并排序 * @Author: AnNing * @Description: * @Date: Create in 11:28 2019/6/18 */public class MergeSort { /** * * 将arr[l...mid]和arr[mid+1...r]两部分进行归并 * @param arr * @p...
2019-10-11 21:59:29
173
原创 冒泡排序
public class BubbleSort { public static void bubbleSort(int [] a){ if(a.length!=0||a!=null){ for(int i=a.length;i>0;i--){ for(int j=0;j<i-1;j++){ ...
2019-10-11 21:58:44
135
原创 快速排序
/** * 快速排序主要是每次都找到基准元素的位置,然后再分而治之 * 指针交换法:1、将第一个元素当做基准元素,第一个元素为left,最后一个为right * 如果left!=right时,将right与pivot比较,如果大于则向左移动,否则则切换到left; * 切换到left时,如果left比pivot小,则left向右移动,否则切换到right * 交换left和right的...
2019-10-11 21:58:06
132
原创 排序算法——堆排序
堆的定义:大顶堆:arr[i]>=arr[2i+1]&&arr[i]>=arr[2i+2] 小顶堆:arr[i]<=arr[2i+1]&&arr[i]<=arr[2i+2]堆排序的思想:对于给定的N个记录,初始化时把这些记录看做一颗顺序存储的二叉树,然后将其调整为一个大顶堆,然后将堆的最后一个元素与堆顶元素(二叉树的根节点)进行交...
2019-08-15 16:41:57
141
原创 剑指Offer——字符串的排列
题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。思路:看做一个递归问题;求所有可能出现在第一个位置的字符,即将第一个位置的字符依次和后面的每一个字符进行交换; 固定第一个字符,对后面的字符进行全排列。即对后面的字符进行递归;对于递归来说:终止条件就是只...
2019-08-14 10:55:58
156
原创 剑指Offer——把二叉树打印成多行
题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:同从上向下打印二叉树思路,但是需要添加两个变量记录当前层未打印节点和下一层需要打印的节点代码:import java.util.ArrayList;import java.util.Queue;import java.util.LinkedList;/*public class TreeNode {...
2019-08-12 16:51:12
149
原创 剑指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
132
原创 剑指Offer——打印从1到最大的N位数
题目:输入数字n,按照顺序打印出1-最大的n位数的十进制数,比如输入3,则打印1,2,3~一直到最大的3位数999;思路一:题目最大的陷阱,当我们按照10的你次方计算的时候,忽略了如果醉的数超出了int或long数据的范围该怎么处理;所以可以用字符串的操作来代替数学运算;新建一个长度为n的字符串数组,分为两步:在字符串上模拟加法 打印字符串优化思路:新建一个长度为n的字符串数组,在...
2019-08-02 11:22:28
151
原创 剑指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
104
原创 剑指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
167
转载 剑指Offer——字符流中第一个不重复的字符
原文链接:cyc2018.github.io题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。代码:import java.util.Queue;import java.util.LinkedList;public...
2019-07-27 15:51:14
153
转载 剑指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
120
转载 剑指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
106
转载 剑指Offer——不用加减乘除做加法
原文链接:cyc2018.github.io题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:a ^ b 表示没有考虑进位的情况下两数的和,(a & b) << 1 就是进位。递归会终止的原因是 (a & b) << 1 最右边会多一个 0,那么继续递归,进位最右边的 0 会慢慢增多,最后进位会变为 0...
2019-07-27 15:06:34
121
转载 剑指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
138
原创 剑指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
124
原创 剑指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
113
原创 剑指Offer——左旋转字符串
题目:字符串的左旋转操作是把字符串前面的若干个字符转义到字符串的尾部;请定义一个函数实现字符串左旋转操作的功能;比如,输入字符串"abcdefg"和数字2,该函数将返回坐旋转两位得到的结果"cdefgab";思路:类似于翻转单词顺序题目;将字符串从第N为开始分为两部分;翻转前n-1位; 翻转n-最后一位; 翻转整个字符串;代码:public class Solution { ...
2019-07-26 16:00:52
112
原创 剑指Offer——翻转单词顺序列
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内的字符的顺序不变。为了简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I";思路:可以通过两次翻转来实现翻转句子中所有的字符 翻转每个单词中的字符顺序实现的关键在于实现一个函数可以翻转字符串中的一段代码:public class Solution ...
2019-07-26 15:45:02
105
原创 剑指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
155
原创 剑指Offer——和为S的两个数字
题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出任意一对即可。思路一:暴力破解。利用双重循环,以此扫描数组中的数字并求和,遇到和为S的便返回两个数字。时间复杂度为O(n^2);思路二:利用快速排序的思想;设置两个指针,指针P1从前向后遍历,第二个指针P2从后向前遍历;当两个指针指向的数字和等于S时,返回P1,P2指向...
2019-07-26 11:04:35
114
转载 剑指Offer——数组中只出现一次的数字
链接:https://www.nowcoder.com/questionTerminal/e02fdb54d7524710a7d664d082bb7811?f=discussion来源:牛客网-披萨大叔的回答题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:首先:位运算中异或的性质:两个相同数字异或=0,一个数和0异或还是它本身。...
2019-07-25 21:21:24
92
原创 剑指Offer——平衡二叉树
题目:输入一棵二叉树,判断该二叉树是否是平衡二叉树。定义:如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一颗平衡二叉树。思路一:递归重复遍历左右子树,类似于求二叉树的深度;见《剑指Offer——二叉树的深度》 此思路判断上层节点的时候,会多次重复下层节点,增加了不必要的开销;思路二:改为从下往上遍历,使用后续遍历左右根,遍历的时候记录左右子...
2019-07-25 20:22:00
101
原创 剑指Offer——二叉树的深度
题目:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:利用递归求二叉树的深度。如果一个二叉树只有一个节点,那么深度为1;如果根节点只有左子树没有右子树,那么树的深度应该为左子树的深度+1;如果根节点只有右子树没有左子树,那么树的深度应该为右子树的深度+1;如果根节点既有左子树,又有右子树,那么树的深度...
2019-07-25 17:30:42
102
原创 剑指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
158
原创 剑指Offer——数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数。备注:思路一和思路二是一样的,思路二代码更加简洁。常见的思路是利用二分查找到一个K之后向两边扫描,如果有N个K的话时间复杂度就是O(n),不如下面的思路时间复杂度低。思路一:利用二分查找;查找第一个K的位置,查找最后一个K的位置,相减即可得到。时间复杂度为O(LogN)+O(LogN),所以总的时间复杂度为O(logN);代码:pub...
2019-07-25 16:48:59
168
原创 剑指Offer——两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点。思路一:1、先求出两个链表的长度差gap,让比较长的链表先向前遍历gap个节点,然后两个链表同时向前遍历,直到遇到相同的节点为止。时间复杂度:O(m+n);m和n分别为两个链表的长度。/** * 解法一:求得两个链表的长度差d,让较长的链表先走d步,然后两个链表再一起遍历,时间复杂度O(m+n) * @param pH...
2019-07-25 16:08:06
170
原创 剑指Offer——数组中的逆序对
题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007;思路一:扫描整个数组,没扫描到一个数字就和他后面的数字比较大小;如果后面的数字比它小,则这两个数字就组成一个逆序对。时间复杂度为O(n^2);思路二:时间换空间1、例如数组{7,...
2019-07-25 14:50:38
140
原创 剑指Offer——第一个只出现一次的字符
题目:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).思路一:逐个扫描字符串,对每一个字符依次比较后面是否有重复的。时间复杂度为O(n^2);思路二:使用哈希表,第一次扫描字符串,没扫到一个字符,就在哈希表中把对应项的次数+1;接下来扫描第二次时,就能从哈希表中得到该字符出现的...
2019-07-25 10:24:14
121
原创 剑指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
90
原创 剑指Offer——最长不含重复字符的子字符串
题目:输入一个字符串(只包含 a~z 的字符),求其最长不含重复字符的子字符串的长度。例如对于 arabcacfr,最长不含重复字符的子字符串为 acfr,长度为 4。思路:1、如果遍历到的字符没有出现过,则f(i)=f(i-1)+1;其中f(i)表示当前遍历到的字符不重复的距离,即currentLength;2、如果出现过:分两种情况讨论:遍历到的第i个字符和它上次出现在字符串中的位...
2019-07-23 21:14:16
236
原创 剑指Offer——礼物的最大价值
题目:在一个m*n的棋盘的每一个格都放有一个礼物,每个礼物都有一定价值(大于0)。从左上角开始拿礼物,每次向右或向下移动一格,直到右下角结束。给定一个棋盘,求拿到礼物的最大价值。例如,对于如下棋盘1 10 3 812 2 9 65 7 4 113 7 16 5礼物的最大价值为1+12+5+7+7+16+5=53。...
2019-07-23 20:21:58
140
原创 剑指Offer——把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:可以看成是一个排序问题,在比较两个字符串 S1 和 S2 的大小时,应该比较的是 S1+S2 和 S2+S1 的大小,如果 S1+S2 < S2+S1,那么应该把 S1 排在前面,否则应该把 S2 排在...
2019-07-23 11:27:03
109
转载 剑指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
154
原创 剑指Offer——连续数组的最大和
题目:计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和思路:由下图可知,1、当数组和为负数时,可以摒弃前面数组之和,从当前数字开始计算。2、当遍历到数字为负数...
2019-07-22 20:25:09
107
原创 剑指Offer——数据流中的中位数
题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。定义:1、最大堆:当父节点的键值总是大于或等于任何一个子节点的键值时为最大堆。 2、最...
2019-07-22 17:40:20
110
原创 剑指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
146
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人