算法-ago
一些算法的实现
ImZzBy
这个作者很懒,什么都没留下…
展开
-
java实现 位运算常见模板
一些位运算的技巧具体步骤都写在注释里面啦,有问题欢迎留言只有注释没有代码的可以看看我的其他文章~public class SmallTechniques { public static void main(String[] args) { int number=25; int count=0; System.out.println(number+"的二进制形式为:"+Inte...原创 2020-02-19 19:58:28 · 195 阅读 · 0 评论 -
java实现 用二进制表示浮点数
直接上代码,步骤都在注释里,有问题欢迎留言public class FloatInBinary { public static void main(String[] args) { double num=0.3;//0.3无法用32位的二进制数精确表示 double num2=0.625; StringBuilder str=new StringBuilder("0."); ...原创 2020-02-19 20:00:54 · 899 阅读 · 0 评论 -
java实现 寻找一个数组中落单的数,除他以外都是成对的
详细步骤都在注释里,有问题欢迎留言交流public class LuoDanDeShu { public static void main(String[] args) { //构造一个数组 int arr[]= {25,25,45,45,6,6,94,94,5,1,1}; //因为A^A^B^C^C=B 连续异或可以去重 int x=0; for (int i = 0;...原创 2020-02-19 20:06:41 · 267 阅读 · 0 评论 -
java实现 一个数组中只有一个数仅出现了一次,剩下的都出现了K次,求只出现了一次的那个数
此题我用的是位运算求解,实际上也可以用哈希表,构成键值对求解~ 步骤都在注释里,有问题欢迎留言交流忽略类名…实在想不到啥英语public class JinZhiMiaoYong { public static void main(String[] args) { /** * 思路: * 1)将数组中的每一个数转换为K进制 * 2)逐个相加。因为是不进位加法,所以需要...原创 2020-02-19 20:04:54 · 556 阅读 · 0 评论 -
java实现输出二进制中1的个数 四种解法
0的个数也是同样的思路~说是四种解法实际上是3种~public class OneCount { public static void main(String[] args) { /* * 大思路 * 1)扫描二进制数 * 2)判断是不是1 * * 针对第二步:有三种方法判断是不是1 * 1 左移二进制的1,和二进制的每一位做与运算。判断是不是1...原创 2020-02-19 20:09:55 · 859 阅读 · 0 评论 -
java实现 将一个二进制数的奇偶位进行互调
详细步骤都在注释里hin详细了~public class OddChangeEven { public static void main(String[] args) { /* * 思路: * 1)获得二进制数的所有奇数位(屏蔽掉偶数位) * 2)获得二进制数的所有偶数位(屏蔽掉奇数位) * 3)左移,右移后进行异或运算 * * 所谓屏蔽,就是让其...原创 2020-02-19 20:08:02 · 196 阅读 · 0 评论 -
java实现找出数组中唯一成对的数
详细步骤都在注释里忽略类名…(手动狗头)public class WeiYiChengDui { public static void main(String[] args) { //找到数组中重复的数字,不能利用额外存储空间 //定义一个长度为1001的数组,存放1-1000之中的数字,会有一个数字重复 int N=1001; int arr[]=new int[N];...原创 2020-02-19 20:13:10 · 542 阅读 · 0 评论 -
java 用递归实现插入排序
步骤都再注释里其实插入直接用循环做就可。但是用递归做可以锻炼下思维~public class HowToCreateRecursion { /* * 这个题是“倒着写”,正着实现 * 看似是从数组的末端开始,缩小一个元素,排序,插入 * 其实是先不断的缩小数组,因为k不等于0的情况下,函数就永远不会走到插入那一步 * 从k=1开始,进行插入排序,此步完成后,该数组前两个元素...原创 2020-02-20 22:07:44 · 1338 阅读 · 2 评论 -
如何写递归以及用递归实现斐波那契数列 数组求和 求最大公约数 字符串翻转 打印i到j的每一个数 java实现
详细步骤都再注释里了~public class HowToCreateRecursion { /* * 创建递归的步骤 * 1 找重复:更小规模的子问题 * 2 找变化:变化的量作为参数 * 3 找边界:出口,一般写在递归函数中的第一行 * */ /** * 用递归打印i到j之间的数 * @param i * @param j */ public ...原创 2020-02-20 22:11:17 · 329 阅读 · 0 评论 -
java实现汉诺塔
详细步骤都在注释里public class HanoiTower { public static void hanoiTower(int n,String from,String to,String help) { //from:起点塔 help:辅助塔 to:目标塔 /* * 解题思路: * 假设有A,B,C三个塔 * 将n个圈从A塔挪到B塔, * 相当于...原创 2020-02-20 22:04:50 · 205 阅读 · 0 评论 -
蓝桥杯 分酒问题 bfs应用 java实现
题目描述有4个红酒瓶子,它们的容量分别是:9升, 7升, 4升, 2升开始的状态是 [9,0,0,0],也就是说:第一个瓶子满着,其它的都空着。允许把酒从一个瓶子倒入另一个瓶子,但只能把一个瓶子倒满或把一个瓶子倒空,不能有中间状态。这样的一次倒酒动作称为1次操作。假设瓶子的容量和初始状态不变,对于给定的目标状态,至少需要多少次操作才能实现?本题就是要求你编程实现最小操作次数的计算。输...原创 2020-03-03 22:28:38 · 504 阅读 · 0 评论 -
bfs类型问题小结
针对题型没有明显结点的图这里有两道典型例题迷宫问题分酒问题也就是说,题目中有状态转移或者最短操作步骤数,就要考虑用bfs求解bfs解法框架1 预备工作定义队列:存放结点集合,或者一维,二维的数组:用于防止回溯到已经访问过的结点结点类:必要的成员变量:depth(步骤数)初始结点入队列2 核心代码bfs队列不为空时:1)弹出一个结点2)判断是否为最终结点(是否符合最终解...原创 2020-03-04 19:31:22 · 242 阅读 · 0 评论 -
图的单源最短路径之Bellman Ford算法 java 实现
Bellman Ford 算法简述:遍历所有的边,边有起点i和终点j,如果源点到顶点的最短路径的d[i]已经算出来,就比较d[j]和d[i]+cost,如果前者比较大,则更新d[j]。如此往复,知道某次循环中没有更新的情况import java.util.Arrays;=public class SingleOriginShortestDistanceBellman { publ...原创 2020-03-01 18:17:15 · 372 阅读 · 0 评论 -
蓝桥杯 迷宫问题 java实现
题目描述 /* * ...11111111111111111111111111111 11.111111........1111111111.1111 11.111111..111.11111111.....1111 11.11111111111.1111111111.111111 11.111111.................111111 11.111111.11...原创 2020-03-04 19:18:36 · 2007 阅读 · 0 评论 -
Java实现 图的dfs应用之 八连块 floodfill问题
八连块就是八个方向做深度优先搜索虽说是八个方向搜索,却比四个方向搜索的连通问题要简单Java实现连通检测,主要原因在于visited数组的设置。一般来说,做搜索题都需要设置一个visited数组,用来标记当前点是否被访问过,但是在八连块问题中,可以不需要设置这个数组,只要访问过一个‘@’,就把它变为‘*’public class FloodFill { /* * 输入一个m行n列的...原创 2020-02-24 15:46:14 · 424 阅读 · 0 评论 -
Java实现图的DFS应用之连通检测
题目还有分析过程都在注释里了public class LianTongCheck { /* * 给定一个方阵,定义连通;上下左右相邻,并且值相同 * 可以想象成一张地图,不同的区域被涂上不同颜色 * 输入: * 整数N,(N<50)表示矩阵的行列数 * 接下来N行,每行N个字符,代表方阵中的元素 * 接下来一个整数M,(M<1000)表示询问数 * 接...原创 2020-02-24 14:52:42 · 451 阅读 · 0 评论 -
Java实现图的dfs应用之欧拉道路问题 七桥问题 欧拉道路,欧拉回路的存在条件
输出无向图的欧拉道路七桥问题:七桥问题的百科欧拉将七桥问题抽象成了图论的问题:能否从无向图中的一个结点出发走出一条道路每条边恰好经过一次,且多有的边都走完?欧拉道路:从无向图中的一个结点出发走出一条道路每条边恰好经过一次。简而言之就是可以将所有的边走一遍,且每条边只访问一次。就是可以"一笔画"。存在条件:无向图是连通的,有且最多有两个奇点(度数为奇数)在有向图中,要求最多只能有两个点...原创 2020-02-26 17:49:44 · 397 阅读 · 0 评论 -
最小生成树 Kruskal算法 Java实现
Kruskal算法实现最小生成树其实算法理解起来比较简单:1 取出所有的边,对边进行排序(升序)2 判断边是否合格2-1判断边上的两个点是否来自于同一个集合(需要用到并查集)3 将合格的边加到最小生成树边的集合中4 输出这个集合并查集的实现并查集其实就两个功能:1 find:找某个点的父结点2 union:合并两个点为一个集合(使其中一个点成为另一个点的父结点)import ...原创 2020-02-27 23:52:00 · 1061 阅读 · 0 评论 -
java实现 图的dfs应用之拓扑排序 以及判断图是否有环
拓扑排序+判断图中是否有环拓扑排序:从一个顶点开始,进行dfs,直到某一个点再也没有出度,没有出度的点可以认为是最大的点(之一)。是否有环:为visited数组多添加一个状态:正在被访问状态。如果在一次递归中两次碰到被标记为-1的点,证明成了环public class Topo { //顶点数 static final int n=4; //顶点内容 static String[]...原创 2020-02-24 22:40:20 · 1085 阅读 · 3 评论 -
蓝桥杯 城市建设问题 java实现
问题描述栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修。市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他。C市中有n个比较重要的地点,市长希望这些地点重点被考虑。现在可以修一些道路来连接其中的一些地点,每条道路可以连接其中的两个地点。另外由于C市有一条河从中穿过,也可以在其中的一些地点建设码头,所有建了码头的地点可以通过河道连接。栋栋拿到了允许建设的道路的信息,...原创 2020-03-02 17:05:59 · 363 阅读 · 0 评论 -
java 判断是否为二分图 图的着色问题
判断是否为二分图图的着色问题:把相邻顶点染成不同的颜色的问题二分图:对图进行染色所需的最小颜色数,成为最小着色数。最小着色数为2的图称为二分图。判断是否为二分图还是用深度优先遍历的思想。这里不需要用visited数组,给图的结点新增一个属性color,从任意结点开始,为其染色,染色的同时就相当于已经访问过了该结点,然后挨个访问这个点的邻居,为邻居染色,一旦发现某个点和他的邻居颜色一样,则不是...原创 2020-02-27 12:29:11 · 493 阅读 · 0 评论 -
java实现希尔排序
详细步骤在注释里public class ShellSort { /* * 希尔排序,插入排序的变种,比插入排序效率更高 * 它是缩小增量的插入排序,或者说插入排序是增量为一的希尔排序 * 实现步骤: * 1)指定初始增量(一般为数组长度的一半) * 2)从第一个元素开始,按照增量,将数组划分成一个个组 * 3)对每个组运用插入排序 * 4)重复步骤1-3,每趟的增...原创 2020-02-20 22:02:21 · 257 阅读 · 0 评论 -
java实现 冒泡排序 选择排序
思路都再注释里~直接上代码public class BasicSort { public static void bubbleSort(int n[]) { //沉底/飘起思想 for(int i=1;i<n.length;i++) //外层循环表示完成多少次:数组长度减一次 for(int j=0;j<i;j++) //内层循环表示每轮比较多少次 if...原创 2020-02-21 16:47:18 · 189 阅读 · 0 评论 -
java实现二分查找
详细步骤都在注释里public class BinarySearch { public static void binarySearch(int arr[],int low,int high,int key) { /* * 分析思路: * 在整个数组范围内找元素 * 等价于 * 在左边找 * 与中间元素对比 ...原创 2020-02-20 22:03:45 · 112 阅读 · 0 评论 -
快速排序 单向扫描法 java实现
用单向扫描法实现快速排序快速排序的核心就是对数组的划分:如何划分才能让数组的左边都小于某个值,右边都大于某个值?对数组的划分方法有:单向扫描法,双向扫描法,三分法。这里介绍单向扫描法。快排思想无论是哪种方法,快排的整体框架都可以用这样的伪代码描述 /* 伪代码: * QuickSort(A,start,end) * if(start<end) * int ...原创 2020-03-02 20:44:00 · 596 阅读 · 0 评论 -
快速排序 双向扫描法 java实现
双向扫描法实现快速排序建议先食用这篇单向扫描法实现快速排序,不然可能会有点看不懂单向扫描法实现快速排序双向扫描法的思想双向扫描法就是两个指针都行动:1)定义两个指针,left(初始化指向主元后第一个元素),right(初始化指向最后一个元素)2)先从左往右扫描数组,left遇到大于主元的元素时停下,再从右往左扫描数组,right遇到小于等于主元的元素时停下3)交换两个指针指向的元素...原创 2020-03-02 21:54:42 · 636 阅读 · 1 评论