![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 58
Cry丶
/*有些梦虽然遥不可及, 但却并不是不可以实现*/<br>
写博客的原因(告戒自己):
1.记录自己的成长, 是非对错10年后回望;
2.我踩过的坑,同仁们就不要再迈了;
3.开源精神 理想主义 利他主义。
展开
-
【面试真题】实现一个快速排序
题干:我们使用的是经典快速排序: 以左边界为基准值base,具体分析过程详见博主【Java版算法思想(排序)】选择&冒泡&快排参考代码:/** * @author cry777 * @program demo1 * @description 经典快速排序: 以左边界为基准值 * @create 2022-02-25 */public class QuickSort { public static void main(String[] args) {原创 2022-02-25 09:47:02 · 261 阅读 · 1 评论 -
【面试真题】设计一个抢红包算法,单个红包最大不能超过总金额的90%
题干:总金额 double total = 100D; 总人数 int num = 10;返回一个List<Double>参考代码:public class RedWars { public static List<Double> list = new ArrayList<>(10); public static double remain; public static double used; public stat原创 2022-02-25 09:18:38 · 524 阅读 · 0 评论 -
【面试真题】给定3个班级,班级id号分别为c1,c2,c3,随机生成一个List<Student> students,每个班级的score和classId均随机,输出每个班级里学生的平均成绩
给定一个基本数据类型如下:class Student{ int score; // 成绩 String classId; // 班级id号}给定3个班级,班级id号分别为c1,c2,c3,随机生成一个List<Student> students; 该students的size()为15000,每一个学生Student的班级随机从c1、c2和c3中选取,每一个学生Student的成绩score随机从60到100随机选取,输出为每个班级里学生的平均成绩(多线程)。参考代码class原创 2022-02-17 23:09:52 · 499 阅读 · 0 评论 -
【面试真题】一个函数,有两个输入变量,分别为n和x,这个函数的计算公式如下,请用递归的方式完成代码的编写
我们选用的 OpenJDK 14 最新环境,你的 java 代码会传送至 ShowMeBug 提供的该环境中。你必须定义一个 ShowMeBug 类和 public static void main(String[] args) 方法,这样我们才能运行出结果。一个简单的例子:public class ShowMeBug { public static void main(String[] args) { System.out.println("Hello World!"); }}原创 2022-02-17 22:28:08 · 881 阅读 · 0 评论 -
【CSDN 年度征文|回顾 2021,展望 2022】【Java版高级数据结构】图论基础(DFS&BFS)
本文涉及代码见:https://github.com/chenruoyu0319/data-structure-for-java/tree/main/%E5%9B%BE%E8%AE%BA%E5%9F%BA%E7%A1%80%EF%BC%88DFS%26BFS%EF%BC%89一、什么是图?图(Graph)是一种非线性数据结构。可以说它是一种比较复杂的数据结构,它比树还要复杂。因为图没有层的概念,它们之间的任意元素都可能产生关系。图的基本知识:(1)顶点:图中的节点(2)边:节点与节点之间的关系(原创 2022-02-01 15:26:15 · 902 阅读 · 0 评论 -
【Java版高级数据结构】堆树&堆排序
本文涉及代码实现github地址: https://github.com/chenruoyu0319/data-structure-for-java/tree/main/%E5%A0%86%E6%A0%91一、堆树堆是什么?堆是一种特殊的树,他需要满足以下两点:1.是一颗完全二叉树2.其每一个节点的值都大于等于或者小于等于其左右子节点的值。补充:完全二叉树:除了最后一层,其他层每个节点都是满的且最后一层的节点都要靠左排列。大顶堆:首元素为堆内最大的元素小顶堆:首元素为堆内最小的元素二原创 2022-01-23 14:06:30 · 890 阅读 · 0 评论 -
【Java版高级数据结构】赫夫曼树(哈夫曼树)
本文代码地址: https://github.com/chenruoyu0319/data-structure-for-java/tree/main/%E8%B5%AB%E5%A4%AB%E6%9B%BC%E6%A0%91(%E5%93%88%E5%A4%AB%E6%9B%BC%E6%A0%91)一、赫夫曼树(哈夫曼树)首先让我们来思考2个问题:1.电报发送:二战的时候大家都知道那时候普遍会应用电报,如果让你来设计一个电报的发送编码你该如何设计呢?一种思路就是做一个映射,比如a b c d ,a映射原创 2022-01-17 04:04:03 · 215 阅读 · 0 评论 -
【Java版高级数据结构】B-Tree&B+Tree
B+Tree的详细分析: https://github.com/chenruoyu0319/data-structure-for-java/tree/main/B-Tree%26B%2BTree一、改造二叉搜索树普通的二叉搜索树,在执行例如select * from table where id > 12的sql语句的时候,会遇到范围查询查到一个叶子节点,还需要回到父节点去遍历其他值的问题,并不能直接高效的把所有值查出来。但如果我们把二叉搜索树改造成如下模样,把所有节点都在叶子节点上存储一份,原创 2022-01-13 08:29:11 · 762 阅读 · 0 评论 -
【Java版高级数据结构】二叉搜索树&红黑树
二叉搜索树和红黑树相关代码: https://github.com/chenruoyu0319/data-structure-for-java/tree/main/%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%26%E7%BA%A2%E9%BB%91%E6%A0%91一、二叉搜索树(二叉排序树)二叉搜索树又叫二叉查找树,二叉排序树;它具有以下特点:1.如果它的左子树不为空,则左子树上结点的值都小于根结点。2.如果它的右子树不为空,则右子树上结点的值都大于原创 2022-01-09 05:09:36 · 279 阅读 · 0 评论 -
【Java版算法思想】双指针算法
一、什么是双指针算法?严格的来说,双指针只能说是是算法中的一种技巧。双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。二、双指针算法的适用范围常用在数组遍历中,我们使用两个指针进行操作,遍历完整个数组来实现我们的目的。一般能用双指针算法解决的问题,都可以用暴力解法解决。所以双指针问题基本有以下几个细节:1、注意双指针的初始位置。2、注意双指针的移动方法。3、注意遍历的结束条件。三、顺序原创 2021-12-29 14:08:06 · 2634 阅读 · 1 评论 -
【Java版高级数据结构】树论基础&二叉树
二叉树的介绍、不同二叉树的特性、用java实现的二叉树4种遍历方式原创 2021-12-25 17:27:34 · 413 阅读 · 0 评论 -
【Java版算法思想】贪心算法&动态规划
本文涉及到的贪心和动态规划代码都已上传github可自取,解释不明之处可评论留言,能力范围内一定尽力解答: github https://github.com/chenruoyu0319/data-structure-for-java/tree/main/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95%26%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92一、贪心算法概念:贪心算法又叫做贪婪算法,它在求解某个问题是,总是做出眼前最大利益。也就是说只顾原创 2021-12-19 02:37:03 · 915 阅读 · 0 评论 -
【Java版算法思想(排序)】计数排序
计数排序是一种在数据满足特定的长度格式,且重复度较低的情况下效率较高的排序算法,在没有数据重复的情况下排序效率可以达到O(n)。其核心思路就是利用了数组的特性,利用数组的下标对应具体的数据,数组内的元素值对应这种数据出现的次数。下面让我们直接来看一个例子,比如如果要你对200w名某省考生的某次考试成绩进行一个排序,你会怎么选择? 这边假设成绩最多取小数点后2位。...原创 2021-12-19 01:31:50 · 383 阅读 · 0 评论 -
【Java版算法思想(排序)】选择&冒泡&快排
本文代码已上传github: https://github.com/chenruoyu0319/data-structure-for-java/tree/main/%E9%80%89%E6%8B%A9%26%E5%86%92%E6%B3%A1%26%E5%BF%AB%E6%8E%92%EF%BC%88%E6%8E%92%E5%BA%8F%EF%BC%89一、选择排序选择排序的思路和插入排序非常相似,也分已排序和未排序区间。但选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾(即未排序区原创 2021-12-07 23:47:25 · 578 阅读 · 0 评论 -
【Java版算法思想】递归&分治&回溯&枚举&基础数论
本篇涉及代码github地址: https://github.com/chenruoyu0319/data-structure-for-java/tree/main/%E9%80%92%E5%BD%92%26%E5%88%86%E6%B2%BB%26%E5%9B%9E%E6%BA%AF%26%E6%9E%9A%E4%B8%BE一、前言比如在微信分销系统中有一个返利,大家应该都知道,比如B是A的下线,C是B的下线,那么在分钱返利的时候A可以分B,C的钱,这时候我们是不是就要分别找B,C的最后上级,即A-&原创 2021-11-25 00:04:58 · 456 阅读 · 0 评论 -
【Java版数据结构】队列
本文所有代码已上传github: https://github.com/chenruoyu0319/data-structure-for-java/tree/main/%E9%98%9F%E5%88%971.队列的定义定义:队列是一种特殊的线性表,特殊之处在于它只允许在表(线性表)的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾(线性表尾端),进行删除操作的端称为队头(线性表前端)。队列中没有元素时,称为空队列。队原创 2021-11-20 14:37:32 · 659 阅读 · 0 评论 -
【Java版数据结构】栈
一、栈的基本结构1. 结构图后进先出(LIFO) 、先进后出(FILO)2. 如何理解栈比如我们在放盘子的时候都是从下往上一个个放,拿的时候是从上往下一个个的那,不能从中间抽,这种其实就是一个典型的栈型数据结构。后进先出即Last In First Out (LIFO)。3.栈如何实现其实它是一个限定仅在表尾(链表头)进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删原创 2021-11-14 23:00:53 · 725 阅读 · 0 评论 -
【Java】int与char类型间的相互转化技巧
思路:(1)int类型转char类型,将数字加一个‘0’,并强制类型转换为char即可。(2)char类型装int类型,将字符减一个‘0’即可。public static void main(String[] args) { //int类型转char类型 int number = 9; char cNumber= (char) (number+'0'); System.out.println("Number "+number+" to char is:"+cNumber原创 2021-11-14 00:48:21 · 6265 阅读 · 0 评论 -
【Java版数据结构】链表
一、基本链表结构1.结构图2.链表的定义链表通过指针将一组零散的内存块串联在一起。其中,我们把内存块称为链表的“结点”。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址。3.特点(1)不需要连续的内存空间。(2)有指针引用(3)三种最常见的链表结构:单链表、双向链表和循环链表4.单链表从单链表图中,可以发现,有两个结点是比较特殊的,它们分别是第一个结点和最后一个结点。我们一般把第一个结点叫作头结点,把最后一个结点叫作尾结点。其中,头结点用来记录链原创 2021-11-10 23:31:12 · 463 阅读 · 0 评论 -
约瑟夫(Joseph)问题
背景约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。现在问你最后留下的人是谁?比如N=6,M=Q留下的就是11 2 3 4 5 6 => 6 1 2 3 4 => 6 1 2 3 =>1 2 3 => 1 3 => 1解决方案public class Joseph { private Node head; private原创 2021-11-09 10:34:35 · 651 阅读 · 0 评论 -
Java实现一个LRU算法
一、核心思想通过链表实现:LRU算法思路:每次新增节点时1.去链表里面遍历,如果找到了,删掉后插入到头部,头部就是最新的链表。2.如果不在原来的链表里,如果有空间就插入头部,如果没有空间就删除最后一个。二、代码public class MyLRU { private LruNode head; private LruNode tail; /** * 链表长度 */ private int size = 0; private原创 2021-11-08 10:06:44 · 452 阅读 · 0 评论 -
Java切割list算法
1.按照份数划分list /** * 1> 按照份数---划分list * @param source * @param num 想要划分成多少份 * @return */ public static <T> List<List<T>> splitListForNum(List<T> source,int num){ List<List<T>> result=new ArrayList<原创 2021-11-02 10:26:15 · 1605 阅读 · 0 评论 -
【Java版数据结构】数组
一、例题一:2的n次方判断一个数是否是2的N次方。比如2 4 8 16,是的;6 10 不是的。就看这个数是不是可以拆成N个2相乘。解法1: public static boolean solution1(int x) { // 4 6 16 是2的n次方 , 15 不是 if (x == 0 || x == 1) { return true; } while (x > 1) {原创 2021-10-31 19:27:17 · 403 阅读 · 0 评论 -
【附Demo】时间复杂度到底是如何计算的?
首先我们要知道,在一个工程中,时间复杂度主要可能存在于2个地方:大循环和网络IO,这是经验,下面让我们分情况来讨论对于各种场景下的时间复杂度,到底是该如何计算的?首先我们来看张图:对于常见的时间复杂度,它们的大小关系为:O(1) < O(log(n)) < O(n) < O(nlog(n)) < O(n2) < O(nx) (x > 2)一、O(1)小技巧:只要循环是确定的,那么这段代码块的时间复杂度就是O(1)for (int i = 0; i <原创 2021-05-18 20:04:29 · 179 阅读 · 0 评论 -
【算法:Java实现】判断一个数是否是2的N次方
比如2 4 8 16,是的;6 10 不是的。就看这个数是不是可以拆成N个2相乘。解法一:暴力解法,循环, public static boolean solution1(int x) { // 4 6 16 是2的n次方 , 15 不是 if (x == 0 || x == 1) { return true; } while (x > 1) { int i = (x % 2 ==原创 2021-05-18 19:33:19 · 1262 阅读 · 0 评论 -
java运算符优先级
要注意红框里,与运算&的优先级是低于==条件判定符的,所以在带有&运算的场景下,如果需要确保&先执行,需要在运算表达式两侧带上()原创 2021-05-17 20:57:35 · 83 阅读 · 0 评论 -
【数学】LeeCode12.整数转罗马数字
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX+ V + II 。通常情况原创 2021-05-15 22:09:15 · 113 阅读 · 0 评论 -
【数学】LeeCode13. 罗马数字转整数
罗马数字包含以下七种字符: I, V,X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。通常情况原创 2021-05-14 17:22:53 · 168 阅读 · 0 评论 -
【数学】LeeCode9.回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。/*class Solution { // 题解一:将整数转为字符串来处理 public boolean isPalindrome(int x) { StringBuilder temp1 = new StringBuilder(3).append(x); Str原创 2021-05-14 10:04:25 · 84 阅读 · 0 评论 -
【数学】LeeCode7.整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1],就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。题解一:修改最终rev类型为long第一反应就是, 取余得到个位数,然后除以 10 去掉个位数,然后用一个变量保存倒置的数。一个整数%10得到该整数的个位数,/10得到该整数的前几位(除最后一位),要实现整数的翻转,只需要在以整数x!=0为条件的循环体内,令y = x%10原创 2021-05-13 09:53:47 · 160 阅读 · 0 评论 -
【数组】LeeCode1. 两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。题解一:暴力解法简单粗暴些,两重循环,遍历所有情况看相加是否等于目标和,如果符合直接输出。class Solution { // 解法1: 暴力解法 public int[] twoSum(int[] nums, int target) {原创 2021-05-11 20:19:26 · 79 阅读 · 0 评论 -
雪花算法的原理和实现Java
原文链接:https://blog.csdn.net/lq18050010830/article/details/89845790SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的,后面的代码中有详细的注解。这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作转载 2021-04-18 23:30:01 · 58 阅读 · 0 评论 -
【算法-Java】给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
一、示例示例 1:输入:s = "25525511135"输出:["255.255.11.135","255.255.111.35"]示例 2:输入:s = "101023"输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]二、说明有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。例如:“0.1.2.201” 和 “192.168.1原创 2021-01-06 21:22:51 · 3503 阅读 · 0 评论 -
【算法-Java】将 Unix 风格给出的一个文件的绝对路径转换为规范路径。
一、示例示例 1:输入:"/home/"输出:"/home"解释:注意,最后一个目录名后面没有斜杠。示例 2:输入:"/../"输出:"/"解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。示例 3:输入:"/home//foo/"输出:"/home/foo"解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。示例 4:输入:"/a/./b/../../c/"输出:"/c"示例 5:输入:"/a/../../b/../c//.//"输出:"/c"示原创 2021-01-06 19:09:48 · 718 阅读 · 0 评论 -
【算法-Java】给定一个字符串,逐个翻转字符串中的每个单词。
一、示例示例 1:输入:"the sky is blue"输出:"blue is sky the"示例 2:输入:" hello world! "输出:"world! hello"解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输入:"a good example"输出:"example good a"解释:如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。示例 4:输入:s = " Bob Loves A原创 2021-01-06 05:50:43 · 1788 阅读 · 0 评论 -
【算法-Java】给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
一、示例示例 1:输入: num1 = "2", num2 = "3"输出: "6"示例 2:输入: num1 = "123", num2 = "456"输出: "56088"二、说明num1 和 num2 的长度小于110。num1 和 num2 只包含数字 0-9。num1 和 num2 均不以零开头,除非是数字 0 本身。不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。三、解题思路对于比较小的数字,做运算可以直接使用编程语言提供原创 2021-01-06 04:54:38 · 4521 阅读 · 0 评论 -
【算法-Java】给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
一、示例示例 1:输入: num1 = "2", num2 = "3"输出: "6"示例 2:输入: num1 = "123", num2 = "456"输出: "56088"二、说明num1 和 num2 的长度小于110。num1 和 num2 只包含数字 0-9。num1 和 num2 均不以零开头,除非是数字 0 本身。不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。三、解题思路这种方法背后的想法是,只有当两个字符串包含相同次原创 2021-01-05 23:22:48 · 2830 阅读 · 1 评论 -
【算法-Java】编写一个函数来查找字符串数组中的最长公共前缀。
一、示例示例 1:输入: ["flower","flow","flight"]输出: "fl"示例 2:输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀。二、说明所有输入只包含小写字母 a-z 。三、解题思路当字符串数组长度为 0 时则公共前缀为空,直接返回;令最长公共前缀 ans 的值为第一个字符串,进行初始化;遍历后面的字符串,依次将其与 ans 进行比较,两两找出公共前缀,最终结果即为最长公共前缀;如果查找过程中出现了 an原创 2021-01-05 16:40:53 · 4500 阅读 · 0 评论 -
【算法-Java】给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
一、示例示例 1:输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。示例 4:输入: s = "原创 2021-01-04 18:22:21 · 2222 阅读 · 0 评论