
算法
各种算法学习
罗彬桦
君子以自强不息
展开
-
Leetcode Rotate Image
First Methidclass Solution { public void rotate(int[][] matrix) { int x = matrix.length; for (int i = 0; i < x; i++){ for (int j = i + 1; j < x ; j++){ int temp = matrix[i][j]; ..原创 2021-08-31 14:50:55 · 184 阅读 · 0 评论 -
The sum of two Numbers And The sum of three number
The sum of two Numbers1、n*(n-1)/2 Method to iterate through,Call each other Time complexity:O(n^2) Spatial complexityO(1)class Solution { public int[] twoSum(int[] nums, int target) { int s = nums.length - 1; for (int..原创 2021-08-26 18:04:50 · 283 阅读 · 0 评论 -
2013年JavaB组题4《黄金连分数》
黄金连分数标题: 黄金连分数 黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。 对于某些精密工程,常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一 个庞然大物,其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!! 言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。 比较简单的一种是用连分数:原创 2020-12-13 21:31:37 · 109 阅读 · 0 评论 -
2013年JavaB题2《马虎的算式》
马虎的算式小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。有一次,老师出的题目是:36 x 495 = ?他却给抄成了:396 x 45 = ?但结果却很戏剧性,他的答案竟然是对的!!因为 36 * 495 = 396 * 45 = 17820类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢原创 2020-12-13 20:18:23 · 136 阅读 · 0 评论 -
蓝桥杯2013年JavaA题10(大臣旅费)
大臣旅费非常久曾经,T王国空前繁荣。为了更好地管理国家,王国修建了大量的高速路,用于连接首都和王国内的各大城市。为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得不论什么一个大城市都能从首都直接或者通过其它大城市间接到达。同一时候,假设不反复经过大城市。从首都到达每一个大城市的方案都是唯一的。J是T国重要大臣,他巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到还有一个城市成了J最常做的事情。他有一个钱袋,用于存放往来城市间的路费。聪明的J发现,假设不在某个城市停下来修整,原创 2020-12-08 02:08:45 · 233 阅读 · 1 评论 -
蓝桥杯2013JavaA题7(错误票据)
【蓝桥杯】错误票据问题描述某涉密单位下发了某种票据,并要在年终全部收回。每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。你的任务是通过编程,找出断号的ID和重号的ID。假设断号不可能发生在最大和最小号。输入格式要求程序首先输入一个整数N(N<100)表示后面数据行数。接着读入N行数据。每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于10原创 2020-12-01 00:28:19 · 310 阅读 · 0 评论 -
蓝桥杯2013年JavaA题9(剪格子)
历届试题 剪格子我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60。本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。如果无法分割,则输出 0。输入格式程序先读入两个整数 m n 用空格分割 (m,n<10)。表示表格的宽度和高度。接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000。输出格式输出一个整数,表示在所有原创 2020-12-02 01:09:27 · 186 阅读 · 0 评论 -
蓝桥杯2013Java题5(三部排序)
5.标题:三部排序一般的排序有许多经典算法,如快速排序、希尔排序等。但实际应用时,经常会或多或少有一些特殊的要求。我们没必要套用那些经典算法,可以根据实际情况建立更好的解法。比如,对一个整型数组中的数字进行分类排序:使得负数都靠左端,正数都靠右端,0在中部。注意问题的特点是:负数区域和正数区域内并不要求有序。可以利用这个特点通过1次线性扫描就结束战斗!!以下的程序实现了该目标。 static void sort(int[] x) { int p = 0; //其实p=0的用法是原创 2020-11-27 09:52:20 · 187 阅读 · 0 评论 -
2013年蓝桥杯JavaA题2
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。地上画着一些格子,每个格子里写一个字,如下所示:从我做起振我做起振兴做起振兴中起振兴中华比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其他位置。一直要跳到“华”字接收。要求跳过的路线刚好构成“从我做起振兴中华”这句话。请你帮助小明算一算他一共有多少种可能的跳跃路线呢?虽然说这到题都可以口算出来,但是它还是让我再次体会到了递归的强大本题一共三种操作:①向左跳②向下跳③当达到边界(下边界原创 2020-11-26 14:21:35 · 291 阅读 · 0 评论 -
蓝桥杯2013年JavaA组题3
梅森素数如果一个数字的所有真因子之和等于自身,则称它为“完全数”或“完美数”例如:6 = 1 + 2 + 328 = 1 + 2 + 4 + 7 + 14早在公元前300多年,欧几里得就给出了判定完全数的定理:若 2^n - 1 是素数,则 2^(n-1) * (2^n - 1) 是完全数。其中 ^ 表示“乘方”运算,乘方的优先级比四则运算高,例如:2^3 = 8, 2 * 2^3 = 16, 2^3-1 = 7但人们很快发现,当n很大时,判定一个大数是否为素数到今天也依然是个难题。因为原创 2020-11-26 15:46:46 · 150 阅读 · 0 评论 -
2013年蓝桥杯JavaA组题4(颠倒的价牌)
题目标题: 颠倒的价牌小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店。其标价都是4位数字(即千元不等)。小李为了标价清晰、方便,使用了预制的类似数码管的标价签,只要用颜色笔涂数字就可以了。这种价牌有个特点,对一些数字,倒过来看也是合理的数字。如:1 2 5 6 8 9 0 都可以。这样一来,如果牌子挂倒了,有可能完全变成了另一个价格,比如:1958 倒着挂就是:8561,差了几千元啊!!当然,多数情况不能倒读,比如,1110 就不能倒过来,因为0不能作为开始数字。有一天,悲剧终于发生原创 2020-11-27 02:06:20 · 354 阅读 · 0 评论 -
唯一成对的数(算法很美)
问题:1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?解法一:显然已经有人提出了一个比较精彩的解法,将所有数加起来,减去1+2+…+1000的和。这个算法已经足够完美了,相信出题者的标准答案也就是这个算法,唯一的问题是,如果数列过大,则可能会导致溢出。解法二:异或就没有这个问题,并且性能更好。将所有的数全部异或,得到的结果与123…1000的结果进行异或,得到的结果就是重复原创 2020-12-07 10:55:08 · 372 阅读 · 0 评论 -
dfs-数独游戏《算法很美》
问题你一定听说过“数独”游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。数独的答案都是唯一的,所以,多个解也称为无解。本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。格式要求,输入9行,每行9个数字,0代表未知,其它数字为已知。输出9行,每行9原创 2021-01-30 21:13:56 · 365 阅读 · 0 评论 -
全排列-递归法《算法很美》
全排列-递归法思路:以二叉树的角度去学习递归。public class 全排列递归 { public static void main(java.lang.String[] args) { ArrayList<java.lang.String> res = new 全排列递归().getPermutation("12345"); System.out.println(res.size()); System.out.println(原创 2021-01-29 19:30:12 · 134 阅读 · 0 评论 -
全排列-迭代法《算法很美》
全排列-迭代法思路: 全排列大家都懂,只是用迭代的方式罢了。具体思路:其实非常简单的啦,第一次你看到的时候,你会觉得,如果给res.add加入字符的话,不是超过n个了吗?如果你仔细发现,其实他是根据遍历每一个字符,然后给每一个字符的前、后、中加入字符,然后遍历下一个字符的时候,是根据上一个遍历的字符串数组在进行叠加的!——一共有3层for循环,第一层:遍历每一个字符。第二层:访问上一次的字符串数组,然后给每个字符串的前、后加字符第三层:给字符串中间加字符。public class 全排列原创 2021-01-29 17:36:41 · 464 阅读 · 2 评论 -
非空子集之二进制法
非空子集之二进制法思路:比如现在n=3;那么2的n3次方为8;1:00012:00103:00114:01005:01016:01107:01118:1000其实上面的也就代表着下例:1:[1]2:[2]3:[2,1]4:[3]5:[3,1]6:[3,2]7:[3,2,1]8:[] for (int j = n - 1; j >= 0; j--) { if (((i >> j) & 1) == 1) {原创 2021-01-24 23:01:44 · 180 阅读 · 0 评论 -
非空子集《算法很美》
非空子集思路: 其实主要理解HashSet即可,利用HashSet集合的不重复原则。利用HashSet嵌套public Set<Set<Integer>> getSubsets2(int[] A, int n) { Set<Set<Integer>> res = new HashSet<>(); Set<Integer> res_new = new HashSet<>(); res_new.ad原创 2021-01-24 13:25:03 · 220 阅读 · 0 评论 -
合法括号《算法很美》
合法括号思路: 特别简单,就是利用HashSet的不重复性,进行迭代即可。还有就是,每次迭代就有3种情况即:左括号,右括号,中间括号。1.输出合法的括号组合输入括号对数输出所有合法组合输入:3输出:()()(),((())),(()()),()(()),(())(),2.判断一个字符串是否合法public class 非数值型问题 { public static void main(String[] args){ 非数值型问题 obj = new 非数值型问题原创 2021-01-23 23:31:32 · 162 阅读 · 0 评论 -
硬币表示某个给定值数《算法很美》
硬币表示某个给定值数分为两次方式:递推和递归的形式。/** * 假设我们有8种不同的值的硬币{1,2,5,10,20,50,100,200},用这些硬币组合构成一个给定的数值n。 * 例如n=200,那么一种可能的组合方式为 200 = 3 * 1 + 1*2 + 1*5 + 2*20 + 1*50 + 1*100. * 问总共有多少种可能的组合方式?(这道题目来自著名变成网站ProjectEuler)类似的题目还有: * * [华为面试题] 1分2分5分的硬币三种,组合成1角,共有多原创 2021-01-23 21:51:46 · 244 阅读 · 1 评论 -
机器人走方格问题《算法很美》
机器人走方格问题有一个X*Y的网格,一个机器人只能走格点且只能向右或向下走,要从左上角到右下角。请设计一个算法,计算机器人有多少种走法。给定两个正整数int x,int y,请返回机器人的走法数目。保证x + y小于等于12.思路: 一共有两种思路啦!还是那样,一种是老板思维递归,一种是递推打工思维。具体思路:递归我就不讲解了。递推:开辟一个存放方格数组。因为机器人只能往右或者往下走。先将边界都遍历赋值为1,因为边界只能走1方法的格子。然后再遍历边界里面的格子,state[i][j]原创 2021-01-15 22:20:28 · 520 阅读 · 0 评论 -
双管齐下解决递归问题《算法很美》
1.1 “逐步生成结果” 类问题之数值型自下而上的递归(递推,数学归纳,动态规划)解决简单情况下的问题推广到稍复杂情况下的问题…如果递推次数很明确,用迭代如果有封闭形式,可以直接求解例子cc9.1 上楼梯cc9.2 机器人走方格cc9.8 银币表示为什么写成递归因为递归有更强的表达力上楼梯问题有个小孩政治上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶、3阶。请实现一个方法,计算小孩有多少种上楼的方式。为了防止溢出,请将结果Mod 1000000007原创 2021-01-15 21:08:23 · 136 阅读 · 0 评论 -
欧几里得算法扩展之裴蜀公式《算法很美》
贝祖等式- 对任何整数**a、b**和它们的**最大公约数d**,关于未知数x和y的线性丢番图方程(称为裴蜀等式): **ax + by = m 有整数解时当且仅当m是d的倍数。** 裴蜀等式有解时必然有无穷多个整数解,每组解x、y都 称为裴蜀数,可用扩展欧几里得算法(Extended Euclidean algorithm)求得。- 方程12x+42y=6有解- 特别地,方程 ax+by=1 有整数解当且仅当整数a和b互素- 扩展欧几里得算法就是原创 2021-01-13 03:30:13 · 414 阅读 · 0 评论 -
必备求和公式《算法很美》
必备求和公式我直接把视频的图截了过来,以后看的话就可以直接翻自己博客找。下面那个平方的意思是1^2 + 2^2 + 3^2 + …下面的底数是等差的,上面的是有次方的。下面那个递减几何级数是1 + 1/2 + 1/4 + 1/8 + 1/10...原创 2021-01-11 01:42:02 · 328 阅读 · 0 评论 -
阶梯尼姆游戏《算法很美》
阶梯尼姆游戏public class 阶梯尼姆博弈 { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int caseNum = sc.nextInt(); int[][] data = new int[caseNum][]; for (int i = 0; i < caseNum; i++) {原创 2021-01-11 01:22:57 · 282 阅读 · 0 评论 -
Nim游戏《算法很美》
Nim游戏一共有N堆石子,编号1…n,第i堆中有个a[i]个石子。每一次操作Alice和Bob可以从任意一堆石子中取出任意数量的石子,至少取一颗,至多取出这一堆剩下的所有石子。两个人轮流行动,取光所有石子的一方获胜。Alice为先手。给定a,假设两个都采用最优策略,谁会获胜?思路: 其实就是异或的游戏假如我现在有3,4,5转二进制为0 1 11 0 01 0 1得0 1 0如果先手取掉一个石子1,让对手怎么取都为0则赢。。。。。public class Nim游戏 { p原创 2021-01-10 22:21:58 · 125 阅读 · 2 评论 -
巧用进制解决天平称问题《算法很美》
巧用进制解决天平称问题天平称重:变种3进制用天平称重时,我们希望佣金可能少的砝码组合称出尽可能多的重量。如果有无限个砝码,但它们的重量分别是1,3,9,27,81,…等3的指数幂神奇之处在于用它们的组合可以称出任意整数重量(砝码允许放在左右两个盘中)。本题目要求编程实现:对用户给定的重量,给出砝码组合方案,重量<1000000。例如:用户输入:5程序输出9-3-1思路:输入了5对吧,将5变成3进制则为 “12”,然后将"12"反过来好算"21",进一位则为"121",搜如果是2变原创 2021-01-10 21:37:19 · 346 阅读 · 0 评论 -
hiho字符串《算法很美》
hiho字符串描述:如果一个字符串恰好包含2个’h’、1个’i’和1个’o’,文明就称这个字符串是hiho字符串。例如"olhateher"、"hugelnputhugeoutput"都是hiho字符串。现在给定一个只包含小写字母的字符串S,小Hi想知道S的所有子串中,最短的hiho字符串是哪个。输入:找到S的所有子串中,最短的hiho字符串是哪个,输出该子串的长度。如果S的子串中没有hiho字符串,输出-1。输出:找到S的所有子串中,最短的hiho字符串是哪个,输出该子串的长度,如果S的子串原创 2021-01-07 23:37:49 · 307 阅读 · 2 评论 -
字符串匹配之后缀数组(中)《算法很美》
字符串匹配之后缀数组(中)思路: 其实你想理解这个方法,你先看我上一篇字符串匹配之后缀数组(上)明天再更,先睡觉public class 字符串匹配之后缀数组 { public static void main(String[] args) { // match(); // String res = longestCommonSubString("abracadabra","ecadadabrbcrdar"); // Assertions.a原创 2021-01-07 03:23:38 · 295 阅读 · 0 评论 -
字符串匹配之后缀数组(上)《算法很美》
字符串匹配之后缀数组public class 字符串匹配之后缀数组 { public static void main(String[] args) { // match(); // String res = longestCommonSubString("abracadabra","ecadadabrbcrdar"); // Assertions.assertThat(res).isEqualTo("adabr"); mat原创 2021-01-07 02:46:45 · 222 阅读 · 0 评论 -
字符串匹配之KMP《算法很美》
字符串匹配之KMP思路: 其实就是暴力匹配的改版嘛!要想理解这道题就必须一步一步的去试。先理解nextnext其实就是找前后缀数量比如:模串 :b, a, b, b, a, b, b下标 :0, 1, 2, 3, 4, 5, 6next :0, 0, 1, 2, 3, …_ _ _ _ _ b "b"的前缀和后缀都为空集,共有元素的长度为0。_ _ _ _ b a "ba"的前缀为"b",后缀为"a",共有元素的长度为0。原创 2021-01-04 01:41:42 · 162 阅读 · 0 评论 -
字符串匹配之RabinKarp《算法很美》
字符串匹配之RabinKarp给定一个母串,再给定一个子串,要在母串中找是否有与子串对应的字符串例如:母串S:ABABAC子串P:BAB思路: 滚动hash法,什么是滚动呢?哈哈,滚动的意思有点像叠加。/** * 滚动hash法 * 对目标字符串按d进制求值,mod h 取余作为其hash * 对源串,依次求出m个字符的hash,保存在数组中(滚动计算) * 匹配时,只需比对目标串的hash值和预存的源串的hash值表 */public class Match01_RabinKarp原创 2021-01-02 20:50:59 · 174 阅读 · 0 评论 -
神奇的回文串《算法很美》
神奇的回文串思路: 简单的要死,我就不说了!public class 神奇的回文串 { public boolean isPalindrome(String src){ if (StringUtils.isEmpty(src)){ return true; } //翻转后和自己相同---回文字符串 return src.equals(new StringBuilder(src).reverse().toS原创 2021-01-01 19:20:29 · 143 阅读 · 0 评论 -
去掉字符串中连接出现的k次的0《算法很美》
去掉字符串中连接出现的k次的0思路: 先将字符串转成字符数组,遍历每个字符,每次遍历先将字符 char c = arr[i];,然后判断是否为0,如果为0则count++,否则就查看你是否出现k次,如果出现过k次就把k次移除只留余数装进sb中,不然就装进字符且重置count=0。记住还要考虑最后的count问题!import org.assertj.core.api.Assertions;/** 移除字符串中连续出现的K个0** 可以用扫描字符数组的解法,但是用正则表达式更为快捷* */原创 2021-01-01 19:04:53 · 206 阅读 · 0 评论 -
将字符串中按单词翻转《算法很美》
将字符串中按单词翻转思路: 先将res字符串翻转,然后再切割空格放入字符串数组中,最后遍历字符串数组,每次遍历就将字符串再反转过来放入sb中。具体思路:"here you are" 先进行反转成"era uoy ereh"String[] words = s1.split("\\s"); 分割空格,将字符串装进数组中遍历words[]字符串数组,每次遍历就反转字符串并装进sb中。最后输出即可。/** 将字符串按单词翻转,如here you are 翻转成are you here* */原创 2021-01-01 14:39:15 · 293 阅读 · 0 评论 -
旋转词《算法很美》
旋转词思路: 首先要理解旋转词是什么。例如:A B C D AB C D A AC D A A BD A A B CA B C DA B C D A你会发现规律!具体思路:直接b+b然后再sb.toString().contains(a);是否包含a/** 判断A串是否B串的旋转字符串* defabd fabdde -- true** */public class 旋转词 { public static boolean isRotate(String a, Stri原创 2021-01-01 04:44:15 · 267 阅读 · 0 评论 -
判断两字符串的字符集是否相同《算法很美》
判断两字符串的字符集是否相同思路: 就是s1中出现的ASCII的字符集 与 s2出现的ASCII的字符集进行对比,查看是否相同。public class 判断两字符串的字符集是否相同 { /* * 限制串的组成的字符时ASCII * * */ static boolean check(String s1,String s2){ int[] help = new int[256]; //扫描s1 for (int i原创 2021-01-01 04:02:44 · 674 阅读 · 3 评论 -
压缩字符串《算法很美》
压缩字符串思路: 在字符重复出现的时候,例如"aabcccccaaa"变成"a2b1c5a3"就好,charAt就相当于头字符,last是尾字符具体思路:设定int count = 0; // 记录前一个字符的重复次数设定char last = 0;// 上一个字符创建一个StringBuilder sb = new StringBuilder();遍历字符串src当i=0的时候,将第一个字符,char charAt = src.charAt(0);赋值给charAt,并且压进sb中,sb.原创 2021-01-01 02:44:33 · 255 阅读 · 0 评论 -
变形词问题《算法很美》
变形词问题思路: 两种方法,一种是排序好字符数组的方式再进行对比。第二种是计数排序的方式。public class 变形词问题 { /*给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串 这里规定大小写为不同字符,且考虑字符串中的空格 给定一个String stringA和一个string stringB,请返回一个bool,代表两串是否重新排列后可相同。 保证两串的长度都小于等于5000. 测试样例: "Here you原创 2020-12-30 22:03:23 · 181 阅读 · 0 评论 -
巧妙反转字符串《算法很美》
巧妙反转字符串思路: 先创建好一个字符数组,然后进行反转赋值即可。public class 巧妙反转字符串 { public static String reverseString(String iniString) { int len = iniString.length(); char[] charArr = new char[len]; for (int i = 0; i < len; i++){ charAr原创 2020-12-30 21:20:16 · 95 阅读 · 0 评论 -
判断字符串有无重复字符《算法很美》
判断字符串有无重复字符思路: 第一,先判断是ASCLL字符串还是Unicode字符串,ASCLL一共有128个字符。然后设置一个数组,用于存放字符转成int的ASCLL值,最后再进行扫描,查看是否有重复即可。具体思路:排除Unicode字符串if (StringUtils.isEmpty(iniString)) { return true; }创建存放ASCLL字符串的flag[]数组 int[] flag = new int[128];遍原创 2020-12-30 20:59:59 · 293 阅读 · 0 评论