算法
star245
进步多一点
展开
-
grafana内容解密
服务和中间件巡检时,数据已经上传到grafana,所以从grafana中取数据是一个不错的选择;部分内容如:中间件mysql数据,从grafana中获取时,取到的内容为加密内容,需要解密(grafana自己研发的一种数据压缩格式,为一种json压缩算法)解密方案:使用Base64位decode后再使用 Arrow 解码。原创 2023-03-10 10:53:34 · 591 阅读 · 0 评论 -
java大整数求和
大整数求和,思路:数组存储即可步骤:1、创建两个整数数组,数组长度为最大长度整数位数+1。然后分别将两个大整数的值存储到数组中,整数的个位存与数组下标0的位置,最高位位与数组的尾部,方便从左到右的访问数组的习惯2、创建结果数组,长度是较大数的位数+1,+1是给最高位进位预留的3、遍历两个数组,从左到右按照对应下标把元素两两相加,就像小学生计算竖式一样4、把result数组的全部元素再次...原创 2020-04-19 14:41:28 · 1156 阅读 · 1 评论 -
获取删除k个数后的最小值
思路:把原整数的所有数字从左向右比较,如果发现某一位数字大于它右边的数字,那么在删除该数字后,必定回使该数位的的值降低以遍历数为外循环,以k作为内循环,使用栈的特性,让所有数字一个个入栈,当某个数字需要删除时,让数字出栈,最后,把栈的内容转化为字符串结果/** * 删除调整数的k个值后,或得删除后的最小值 * 思路:把原整数的所有数字从左向右比较,如果发现某一位数字大于它右边的数字,那...原创 2020-04-12 16:14:26 · 285 阅读 · 0 评论 -
java 寻找全排列的下一个整数
题目:给出一个正整数,寻找全排列的下一个整数思路:字典数算法。尽量保持高位不变,低位在最小范围内变换顺序。变换顺序的范围大小,取决于当前整数的逆序区域。步骤:1、从后向前查看逆序区域,找到逆序区域的前一位,也就是数组置换的边界2、让逆序区域的前一位和逆序区域中大于它的最小的数字交换位置3、把原来的逆序区域调整为顺序状态时间复杂度:3个步骤中的时间复杂度都是O(n),所以整体复杂度是O...原创 2020-04-12 00:05:16 · 187 阅读 · 0 评论 -
java判断一个数是否为2的整数次幂
/** * 判断一个数是否为2的整数次幂 * 思路: * 如果是一个整数是2的整数次幂,那么当它转成二进制时,只有最高位是1,其他位都是0 * 2的整数次幂一旦减1,它的二进制数字就全部变成了1 * 所以如果采用原数(2的整数次幂)和它减1的结果进行按位与运算,也就是 n&n-1 = 0 */public class PowerOf2 { public stati...原创 2020-04-06 17:57:58 · 988 阅读 · 0 评论 -
java使用栈实现队列
/** * 使用栈实现队列 * 思路:使用两个栈,加入元素是将值保存到栈A中,取出时将A的值全部放到B中,从B中出栈 * 时间复杂度:均摊时间复杂度为O(1) */public class StackQueue { private Stack<Integer> stackA = new Stack<>(); private Stack<I...原创 2020-04-06 17:55:50 · 200 阅读 · 0 评论 -
Java求两个数的最大公约数
/** * 求两个数的最大公约数 */public class GreatestCommonDivisor { /** * 辗转相除法,也叫欧几里得算法 * 定理:两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数 * 缺点:当两个整数较大时,取模运算的效率会低 * 时间复杂度接近O(log(max(...原创 2020-04-05 22:15:23 · 802 阅读 · 0 评论 -
Java最小栈
/** * 实现一个栈,该栈有出栈(pop),入栈(push)、取最小元素(getMin)3个方法。要保证3个方法都是O(1) * 解法:借助辅助栈,解法见代码说明 * 时间复杂度均为O(1),最大空间复杂度为O(n) */public class MinStack { private Stack<Integer> mainStack = new Stack();...原创 2020-04-05 16:51:54 · 182 阅读 · 0 评论 -
求链表是否有环,求链表环的长度和入环点
public class LinkedHasCycle { /** * 判断是否有环:如果跑道是环形的,一块一慢必然相遇 * 时间复杂度 O(n) * 空间复杂度O(1),除了两个指针外没有使用其他额外存储空间 * * @param node * @return */ public static boolea...原创 2020-04-04 23:28:30 · 208 阅读 · 0 评论 -
桶排序
import java.util.*;/** * 桶排序,是一种线性时间的排序算法,需要创建若干个桶来协助排序,每个桶代表一个区间范围,里面可以承载一到多个元素 * 时间复杂度:平均复杂度为O(n) * 第一步:求数列最大、最小值,运算量为n * 第二步:创建崆峒,运算量为n * 第三步:把原始数据的元素分配到各个桶中,运算量为n * 第四步:在每个桶内部做排序,在元素分配相对均...原创 2020-03-29 22:46:54 · 109 阅读 · 0 评论 -
计数排序
import java.util.Arrays;/** * 计数排序,属于稳定排序 * 时间复杂度:代码1、2、4步都涉及遍历原始数列,运算量都是n,第3步遍历统计数列,运算量是m,所以总体运算量是m,所以总体的运算量是3n+m,去掉系数,时间复杂度是O(n+m) * 空间复杂度:如果不考虑结果数组,只考虑统计数组大小的划,空间复杂度是O(m) * 局限性: * 1、当数列最大和最...原创 2020-03-29 17:53:46 · 210 阅读 · 0 评论 -
TopK问题
import java.util.Arrays;import java.util.PriorityQueue;import java.util.Queue;/** * 看起来分治法的快速选择算法的时间、空间复杂度都优于使用堆的方法,但是要注意到快速选择算法的几点局限性: * 第一,算法需要修改原数组,如果原数组不能修改的话,还需要拷贝一份数组,空间复杂度就上去了。 * 第二,算法需...原创 2020-03-26 21:13:42 · 466 阅读 · 0 评论 -
快排
/** * 快排概念: * 快排也属于交换排序,通过元素之间的比较和交换位置来达到排序的目的;在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边, * 比它小的元素移动到数组的另一边,从而将数组拆成两个部分,这种思路叫做分治法 * * 时间复杂度: * 原数组在分支法的思想下,没一轮都会被拆分为两部分,所以遍历的轮数为logn,每一轮的比较和交换需要把数组全部遍历一遍, ...原创 2020-03-26 09:40:37 · 357 阅读 · 0 评论 -
堆排序
堆排序算法步骤:1、把无序数组构建成二叉堆。需要从小到大排序,则构建成最大堆;需要从大到小排序,则构建成最小堆。2、循环删除堆顶元素,替换到二叉堆的末尾,调整堆产生新的堆顶复杂度空间复杂度:因为没有开辟额外的集合空间,所以复杂度为O(1)时间复杂度 O(nlogn):二叉堆的节点“下沉”是堆排序算法的基础,这个复杂度是O(logn)第1步,把无序数组构建成二叉堆,这一步的时间复杂...原创 2020-03-25 23:03:01 · 176 阅读 · 0 评论 -
二叉堆构建
二叉堆本质上一种完全二叉树,分为:最小堆和最大堆,二叉堆的根结点叫做堆顶最大堆:最大堆的任何一个父节点的值都大于或等于他的左右节点的值,最大堆的堆顶是整个堆中最大元素最小堆:最小堆的任何一个父节点的值都小于或等于他的左右节点的值,最小堆的堆顶是这个堆中最小元素二叉堆的几种操作:1、插入节点:插入位置是完全二叉树的最后一个位置;堆的插入操作是单一节点的“上浮”,平均交换次数都是堆高度的一半,...原创 2020-03-25 00:19:24 · 518 阅读 · 0 评论 -
二叉树和二叉树的遍历
满二叉树: 一个二叉树的所有非叶子结点都存在左右孩子,并且所有叶子结点都在同一层级上,那么这个树就是满二叉树完全二叉树: 对一个有n个结点的二叉树,按层级顺序编号,则所有结点的编号从1到n。如果这个树所有结点和同样深度的满二叉树的编号从1到n结点位置相同,则这个二叉树为完全二叉树数据结构包含物理结构和逻辑结构,二叉树属于逻辑结构,可通过多种物理结构来表达:链式存储结构和...原创 2020-03-24 14:35:18 · 133 阅读 · 0 评论 -
java 基本排序
/** * 快速排序 * 分治、递归思想 * 如果要排序数组中下标从 p 到 r 之间的一组数据,我们选择 p 到 r 之间的任意一个数据作为 pivot (分区点)。 我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放右边,pivot 放到中间。经过这一步骤之后,数组 p 到 r 之间的数据就被分成了三个部分,前面 p 到 q-1 之间都是小于pi...原创 2018-10-29 09:35:14 · 120 阅读 · 0 评论 -
二分查找和变形问题
/** * 二分查找,等于某个值的位置,非递归 * @param data */public static int binarySearch1(int[] data,int val){ if(data == null || data.length ==0){ return -1; } int low = 0; int high = data...原创 2018-10-28 16:46:02 · 127 阅读 · 0 评论 -
IP字符串和数字互转
public static long ip2Long(String ipStr){ if(ipStr == null || ipStr.length() == 0){ return 0; } int position1 = ipStr.indexOf("."); int position2 = ipStr.indexOf(".",position1...原创 2018-10-28 16:03:54 · 2451 阅读 · 0 评论 -
n的二进制包含多少个1
/** * 判断一个数中哟多少个1 * 使用移位,int为32位,通过移位判断 */public static int count1(int n){ int count = 0; int i = 0; do{ if((n&1) == 1){ count ++; } i ++; ...原创 2018-10-28 15:44:45 · 701 阅读 · 0 评论 -
时间复杂度
时间复杂度 为什么需要复杂度分析直接跑代码通过统计、监控获取算法的执行时间和占用的内存大小的性能测试,叫事后统计法。局限性:1、测试结果非常依赖测试环境;如,不同处理器效率不同2、测试结果受数据规模影响很大;测试数据规模太小,测试结果可能无法反应算法的性能复杂度分析有不依赖环境、成本低、效率高、易操作、指导性强等特点 概念大O时间复杂度表示法,表示代码执行时间随...原创 2018-09-27 00:06:24 · 478 阅读 · 0 评论