算法
蜗牛互联网
阿里P7,Java 后端方向,欢迎关注和私信~
展开
-
排序算法稳定性
定义排序前后两个相等的数相对位置不变,则稳定稳定性的好处从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用各排序算法的稳定性堆排序、快速排序、希尔排序、直接选择排序不是稳定的排序算法基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法冒泡排序小的元素往前调或者把大的元素往后调比较是相邻的两个元素比较,交换也发生在这两个元素之间稳定排序算法选择排序每个位置选择当前元素最小的在一趟选择中,如果当前元素比一个元素小,而该原创 2022-03-09 08:00:00 · 228 阅读 · 0 评论 -
【Java实现经典算法】有理数四则运算
题目描述本题要求编写程序,计算2个有理数的和、差、积、商。输入描述:输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0。输出描述:分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目原创 2022-03-08 08:00:00 · 753 阅读 · 0 评论 -
【Java实现经典算法】找出数组中重复最多的数
找出数组中重复最多的数public static int getRepeatMost(int a[]){ Map<Integer,Integer> map = new HashMap<Integer,Integer>(); //记录每个元素出现的次数 for(int i = 0;i < a.length;i++){ if(map.containsKey(a[i])){ map.put(a[i], map原创 2022-03-07 08:00:00 · 1846 阅读 · 1 评论 -
【Java 实现经典算法】数字黑洞
题目描述给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。输入描述输入给出一个(0, 10000)区间内的正整数N。输出描述:如果N的4位数字全相等,则在一行内输出“N - N = 0000”否则将计算的每一步在一行内输出,直到6174作为差出现注意每个数字按4位数格式输出。代码实现pa原创 2022-03-04 08:00:00 · 470 阅读 · 0 评论 -
【Java 实现经典算法】每K个结点反转单链表
题目描述给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转。例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4;如果K为4,则输出应该为4→3→2→1→5→6,即最后不到K个元素不反转。思路通过链表长度和K值确定需要反转的结点数每K个反转成新链表,把头保存到List中需要反转的结点数已到并且剩下的结点数不足K个,不反转,即把当前结点存到List中把List中各个链表连接代码package com.liuyong666.pat;impo原创 2022-03-02 03:00:00 · 538 阅读 · 0 评论 -
【Java 实现经典算法】科学计数法
题目描述科学计数法是科学家用来表示很大或很小的数字的一种方便的方法其满足正则表达式[±][1-9]"."[0-9]+E[±][0-9]+即数字的整数部分只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留输入描述:每个输入包含1个测试用例,即一个以科学计数法表示的实数A。该数字的存储长度不超过9999字节,且其指数的绝对值不超过9999。输出描述:对每个测试用例,原创 2022-02-28 08:00:00 · 2690 阅读 · 0 评论 -
Java 实现经典算法之格雷码
格雷码格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示假设使用 n 位元来表示每个数字,任两个数之间只有一个位元值不同如果要产生n位元的格雷码,那么格雷码的个数为2^nn位元格雷码是基于n-1位元格雷码产生的算法产生 0, 1 两个字符串。在第一步的基础上,每一个字符串都加上0和1,但是每次只能加一个,所以得做两次。这样就变成了 00,01,11,10 (注意对称)。在第二步的基础上,再给每个字符串都加上0和1,同样,每次只能加一个,这样就变成了 000,001,01原创 2022-02-19 11:46:54 · 600 阅读 · 0 评论 -
剑指Offer之三十-最小的K个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。解法1对数组排序,取前边k个数存到list集合中该解法时间复杂度依赖于排序代码实现public ArrayList<Integer> getLeastNumbers(int [] input, int k) { ArrayList<Integer> list = new ArrayList<Integer>(); i原创 2022-02-23 08:15:00 · 114 阅读 · 1 评论 -
剑指Offer之二十九-数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解法1使用map,键存元素,值存出现的次数发现有某个元素的次数超过数组长度的一半,则返回该元素代码实现public int moreThanHalfNum(int [] array) { if(array == null || array.length == 0原创 2022-02-21 08:15:00 · 178 阅读 · 0 评论 -
剑指Offer之二十八-字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。结果请按字母顺序输出。输入描述输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。思路先不考虑是否出现重读字符,要对一个字符进行全排列,可以把第一个字符和后面的字符看成两部分而第一个字符后面的字符又可以看成第一个字符和后面两部分,是一个递归过程只要第一个字符的位置没有到达字符串的末尾原创 2022-02-20 10:00:00 · 122 阅读 · 0 评论 -
剑指Offer之二十七-二叉搜索树与双向链表
二叉树结构class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:由于二叉搜索树的中序遍历就是排序的,如果是构造单链表,原创 2022-02-18 08:30:00 · 95 阅读 · 0 评论 -
剑指Offer之二十六-复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。复制一个复杂链表结点定义class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; public RandomListNode(int label){ this.label = label; }}解析遍历链表,每个结点后边复制相同的结原创 2022-02-17 08:30:00 · 153 阅读 · 0 评论 -
剑指Offer之二十五-二叉树中和为某一值的所有路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。解析先序遍历,将遍历过的结点放到A集合中当遍历到叶子结点并且和恰好是目标值时,将遍历经过的所有结点放到B集合中,B则是满足题意的一条路径如果遍历到叶子结点和仍然不等于目标值,那么就移除A集合中添加的结点,修改和,切换到右孩子结点重新计算如果没有遍历到叶子结点就从孩子结点中继续寻找这样的路径二叉树定义class TreeNode {原创 2022-02-16 08:30:00 · 92 阅读 · 0 评论 -
剑指Offer之二十四-二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回ture,否则返回false。假设输入的数组的任意两个数字都互不相同。解析找到根结点从头遍历序列,第一个比根结点大的元素为右子树的起点判断右子树是否都比根结点大,若不是返回false,若是,进行下一步分别把左子树和右子树都以上面规则进行判断,若左右子树都能返回true,则整个序列为二叉搜索树的后序遍历序列,返回true代码实现public boolean verifySquenceOfBST(in原创 2022-02-15 08:30:00 · 66 阅读 · 0 评论 -
剑指Offer之二十三-从上往下打印二叉树
二叉树结构class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。解析考察层序遍历每一次打印一个结点的时候,如果该结点有子节点,则把该结点的子节点放到一个队列的末尾。接下来到队列的头部原创 2022-02-13 11:25:54 · 78 阅读 · 0 评论 -
剑指Offer之二十二-栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列12345是某栈的压栈序列,序列45321是该压栈序列对应的一个弹出序列,但43512就不可能是该压栈序列的弹出序列。解析栈的特点是FIFO压入序列是确定的,则压入序列之间的元素可能会经历压入后马上被弹出的情况具体思路为:根据弹出序列的第一个值,判断在该元素之前被压入栈的所有元素.栈顶元素与弹出序列第一个值进行比较,等则判断弹出序列的下一个元素,判断依原创 2022-02-11 08:45:00 · 339 阅读 · 0 评论 -
剑指Offer之二十一--包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。解析在数据栈的基础上维护一个用来存放最小值的辅助栈每次入栈,新入栈的元素都要和辅助栈栈顶元素比较,如果新入栈的元素更小,就让它也加入最小栈中,否则最小栈再次压入其栈顶元素每次出栈,数据栈和辅助栈同时弹出元素这样就可以保证在任何情况下,辅助栈栈顶元素始终是数据栈中的最小元素代码实现public class MinFunctionStack{ Stack<Integer> data = new原创 2022-02-10 08:45:00 · 159 阅读 · 0 评论 -
剑指Offer之二十--顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字例如,如果输入如下矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10解析因为每打印一圈都会改变起始坐标,所以需要先确定矩阵大小与起始坐标的关系比如4阶矩阵,第一圈起始坐标为(0,0),第二圈起始坐标为(1,1),.原创 2022-02-09 08:45:00 · 343 阅读 · 0 评论 -
剑指Offer之十九-二叉树的镜像
二叉树结构class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}题目描述请完成一个函数,输入一个二叉树,输出它的镜像二叉树镜像定义源二叉树[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9EA1Q8iP-1原创 2021-12-05 08:45:00 · 84 阅读 · 0 评论 -
剑指Offer之十八--树的子结构
二叉树结构class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}题目描述输入两颗二叉树A,B,判断B是不是A的子结构解析二叉树遍历算法的应用原二叉树是否具有某棵子树,只需要判断每个结点是否都在二叉树中出现即可第一步在树A中找到和B的根结点的值一原创 2021-12-04 08:45:00 · 102 阅读 · 0 评论 -
剑指Offer之十七--合并两个排序的链表
链表结点结构class ListNode{ int value; ListNode next = null; public ListNode(int value){ this.value = value; }}题目描述输入两个单调递增的链表,输出两个链表合成后的链表当然我们需要合成后的链表满足单调不减规则递归解法比较两个链表的开头结点,则可以确定合并后链表的第一个结点除合并后的结点外,再次比较两个链表的开头结点,则可以确定合并后链表的第二个结点以此类推,直到所有结点均成原创 2021-12-03 08:45:00 · 80 阅读 · 0 评论 -
剑指Offer之十六-链表反转
题目来自剑指Offer之十六。链表结点结构class ListNode{ int value; ListNode next = null; public ListNode(int value){ this.value = value; }}题目描述输入一个链表的头结点,反转该链表并输出翻转后的头结点代码实现遍历该链表保存后一个结点,以防止当前结点的next值更新后链表断开保存前一个结点,以便当前结点的next值更新为前一个结点最后一个结点将是反转之后的头结点,保存该结原创 2021-12-02 08:45:00 · 76 阅读 · 0 评论 -
剑指Offer之十五-链表中倒数第k个结点
题目来自剑指Offer之十五。链表结点结构class ListNode{ int value; ListNode next = null; public ListNode(int value){ this.value = value; }}基本解法遍历两次,第一次确定链表长度,第二次返回第n-k+1个结点,即为所求注意k不能超过链表长度,代码中要进行判断public static ListNode findKthToTail(ListNode head,int k){ i原创 2021-12-01 08:45:00 · 74 阅读 · 0 评论 -
剑指Offer之十四-调整数组顺序使奇数位于偶数前面
题目来自剑指Offer之十四。基本解法保证奇数和奇数,偶数和偶数之间的相对位置不变遍历每个元素,一旦发现偶数就取出来,让它之后的元素向前移动,把取出来的元素补到最后的空位上类似插入排序,具体实现是外循环找奇数,内循环将该数之前的偶数移位public static void reOrderArray(int array[]){ if(array == null || array.length == 0){ return; } for(int i = 1; i < arr原创 2021-11-30 08:45:00 · 71 阅读 · 0 评论 -
八大排序算法Java实现
冒泡排序/* * 冒泡排序 * 相邻元素比较,大的元素往后调 */public static void bubbleSort(int array[]){ for(int i = array.length - 1 ; i >= 0 ; i--){ boolean flag = false; //设置一趟排序是否有交换的标识 for(int j = 0 ; j < i ; j++){ //一趟冒泡排序 if(array[j] > a原创 2021-11-29 09:21:49 · 82 阅读 · 0 评论