![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法很美
练习
小田月朔一
这个作者很懒,什么都没留下…
展开
-
题11:部分和(dfs:深度优先搜索)
输入:n:4表示元素个数a={1,2,4,7}数组k: 13表示部分和输出:打印出部分和的组合方式package 深度递归;import java.util.ArrayList;import java.util.Scanner;import static java.lang.System.exit;/*n:元素个数 4a:数组{1,2,4,7}k:部分和 13 */public class case10_部分和 { static int kk;翻译 2022-04-07 21:20:07 · 106 阅读 · 0 评论 -
题9:数独游戏
问题你一定听说过“数独”游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。数独的答案都是唯一的,所以,多个解也称为无解。本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。格式要求,输入9行,每行9个数字,0代表未知,其它数字为已知。输出9行翻译 2022-03-23 21:08:08 · 189 阅读 · 0 评论 -
题8:全排列之前缀法
package 深度递归;//前缀法public class case08_全排列下 { public static void main(String[] args) { String s="123"; solve("",s.toCharArray()); } final static int k=3; static int count=0; private static void solve(String pre, char[.翻译 2022-03-21 20:16:30 · 73 阅读 · 0 评论 -
题7:全排列之回溯法
package 深度递归;import java.util.ArrayList;import java.util.Arrays;public class case07_全排列 { public static void main(String[] args) { ArrayList<String> res=new case07_全排列().getPermutation("abc"); System.out.println(res); }.翻译 2022-03-21 19:44:08 · 113 阅读 · 0 评论 -
题6:子集生成之二进制法
import java.util.HashSet;import java.util.Set;public class case05_子集的生成 { public static void main(String[] args) { case05_子集的生成 obj=new case05_子集的生成(); int[] a= {1,2,3}; Set<Set<Integer>> subSets=obj.getSubset(...翻译 2022-03-21 16:26:23 · 71 阅读 · 0 评论 -
题5:子集的生成
题目:实现一种算法,打印n对括号的全部有效组合(即左右括号正确配对)。示例输入;3输出:.((())),(()()),(())(),()(()),()()()翻译 2022-03-21 16:25:08 · 83 阅读 · 0 评论 -
题4:合法括号
package 深度递归;import java.util.HashSet;import java.util.Set;public class case04_合法括号 { public static void main(String[] args) { case04_合法括号 obj=new case04_合法括号(); Set<String> parenthesis=obj.parenthesis(2); System.out.翻译 2022-03-20 21:19:41 · 60 阅读 · 0 评论 -
题3:硬币表示问题
题目:假设我们有8种不同面值的硬币{1,2,5,10,20,50,100,200],用这些硬币组合构成一个给定的数值n。例如n=200,那么一种可能的组合方式为200 = 3 * 1+ 1*l + 1*5 +L*L0+ 1 ..+ I n Lw问总共有多少种可能的组合方式?(这道题目来自著名编程网站ProjectEuler)类似的题目还有:[华为面试题]1分2分5分的硬币三种,组合成1角,共有多少种组合package 深度递归;public class case03_硬币表示 { .翻译 2022-03-20 16:11:36 · 125 阅读 · 0 评论 -
题1:机器人走方格
题目:有一个X*Y的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下请设计一个算法,计算机器人有多少种走法。给定两个正整数int x,int y,请返回机器人的走法数目。保证x+y小于等于12。package 深度递归;import java.util.Scanner;public class case02_机器人走格子 { public static void main(String[] args) { Scanner sc=new Scan.翻译 2022-03-20 14:38:04 · 103 阅读 · 0 评论 -
题11:素数的筛选
埃氏筛选package 数学问题;//埃氏筛选public class case11_素数筛选 { public static void main(String[] args) { long now=System.currentTimeMillis(); m(10000); System.out.println("耗时:" + (System.currentTimeMillis()-now)+"ms"); } privat翻译 2022-03-19 16:39:54 · 66 阅读 · 0 评论 -
题10:判断素数和质因数分解
n是不是素数一 2~n-1间是否有整数能整除n ?一如果d是n的约数,那么n / d也是n的约数,由n = d * (n / d)可知, d<=根号n,所以检查2~根号n之间是否有整数能整除npackage 数学问题;import java.util.HashMap;import java.util.Map;public class case10_素数 { public static void main(String[] args) { //Scanne.翻译 2022-03-19 15:58:53 · 116 阅读 · 0 评论 -
题9:同余方程组
package 数学问题;public class case09_同余方程组 { static long x; static long y; public static long ext_gcd(long a,long b){ if(b==0){ x=1; y=0; return a; } long res=ext_gcd(b,a%b); //.翻译 2022-03-19 15:00:36 · 71 阅读 · 0 评论 -
题8:特殊的同余方程-逆元
模的逆元同余方程ax = 1 (mod n ),gcd(a,n)= 1时有解。这时称求出的x为a的对模n的乘法逆元。对于同余方程ax = 1(mod n ) , gcd(a,n)= 1的求解就是求解方程ax+ ny= 1,x,y为整数。这个可用扩展欧几里德算法求出,原同余方程的唯─解就是用扩展欧几里德算法得出的xpackage 数学问题;import java.util.Scanner;public class case07_特殊同余方程逆元 { static long x;.翻译 2022-03-19 14:10:08 · 183 阅读 · 0 评论 -
题7:青蛙的约会
题目:两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发字前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的、它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面。我们把这两只青蛙分别叫做青蛙A和青翻译 2022-03-18 20:35:41 · 116 阅读 · 0 评论 -
题6:求解同余方程
题目:求解模线性方程(线性同余方程)linear congruence theorem用扩展欧几里德算法求解模线性方程的方法∶同余方程ax=b (mod n)对于未知数x有解,当且仅当b是gcd(a,n)的倍数。且方程有解时,方程有gcd(a,n)个解。求解方程ax=b (mod n)相当于求解方程ax+ ny= b,(x, y为整数)why?思路:扩展欧几里得算法package 数学问题;//扩张欧几里得算法public class case04_裴蜀等式 { sta翻译 2022-03-18 19:54:52 · 1021 阅读 · 0 评论 -
题5:一步之遥
题目:*从昏迷中醒来,小明发现自己被关在X星球的废矿车里。矿车停在平直的废弃的轨道上。他的面前是两个按钮,分别写着“F”和“B”。小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退。按F,会前进97米。按B会后退127米。透过昏暗的灯光,小明看到自己前方1米远正好有个监控探头。他必须设法使得矿车正好停在摄像头的下方,才有机会争取同伴的援助。或许,通过多次操作F和B可以办到。矿车上的动力已经不太足,黄色的警示灯在默默闪烁。.。每次进行F或B操作都会消耗一定的能量。小明飞快地计算,至少要多翻译 2022-03-18 19:30:31 · 82 阅读 · 0 评论 -
题4:裴蜀等式(欧几里得算法)
题目:对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性丢番图方程(称为裴蜀等式)∶ax + by =m有整数解时当且仅当m是d的倍数。裴蜀等式有解时必然有无穷多个整数解,每组解x、 y都称为裴蜀数,可用扩展欧几里得算法(Extended Euclidean algorithm)求得。方程12x+42y=6有解特别地,方程ax+ by=1有整数解当且仅当整数a和b互素扩展欧几里得算法扩展欧几里得算法就是在求a,b 的最大公约数m=gcd(a,b)的同时,求出贝祖等式ax +翻译 2022-03-18 17:26:23 · 437 阅读 · 0 评论 -
题2:Nim游戏
题目:一共有N堆石子,编号1..n,第i堆中有个a[i]个石子。每一次操作Alice和Bob可以从任意一堆石子中取出任意数量的石子,至少取一颗,至多取出这一堆剩下的所有石子。两个人轮流行动,取光所有石子的一方获胜。Alice为先手。给定a,假设两人都采用最优策略,谁会获胜?package 数学问题;public class case02_Nim游戏 { public static void main(String[] args) { int[] arr={5,1.翻译 2022-03-18 15:15:17 · 181 阅读 · 0 评论 -
题1:天平称重:变种3进制
题目:巧用进制天平称重:变种3进制用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。如果有无限个砝码,但它们物重量分别是1,3,9,27,81,......等3的指数幂神奇之处在于用它们的组合可以称出任意整数重量(砝码允许放在左右两个盘中)。本题目要求编程实现︰对用户给定的重量,给出砝码组合方案,重量<1000000。例如∶用户输入∶5程序输出∶9-3-1package 数学问题;import java.util.ArrayList;import java..翻译 2022-03-18 14:50:15 · 140 阅读 · 0 评论 -
题16:next数组的应用
题目:求字符串的周期性前缀,输出字符串的前缀下标和周期的次数。思路:周期串:aaa 、abab、abcabcabcnext[j]=k:j前面的k个字符串和开头的k个字符串相等周期数等于j%(j-k)周期次数等于j/(j-k)package 字符串问题;import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class case16_next数组应用 {翻译 2022-03-18 09:48:57 · 176 阅读 · 0 评论 -
题14:hiho字符串(尺取法)
package 字符串问题;import java.util.Scanner;/** * 描述 * 如果一个字符串恰好包含2个'h'、1个i'和1个'o',我们就称这个字符串是hiho字符串。例如"olhateher"、"hugelnputhugeoutput"都是hiho字符串。 * 现在给定一个只包含小写字母的字符串S,小Hi想知道S的所有子串中,最短的hiho字符串是哪个。输入 * 字符串S * 对于80%的数据,S的长度不超过1000对于100%的数据,S的长度不超过100000.翻译 2022-03-17 21:33:31 · 114 阅读 · 0 评论 -
题13:字符串匹配之KMP
kmp算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是根据给定的模式串W1,m,定义一个next函数。next函数包含了模式串本身局部匹配的信息。完全掌握KMP算法思想学过数据结构的人,都对KMP算法印象颇深。package 字符串问题;public class case13_字符串匹配之KMP { public static void main(S翻译 2022-03-17 11:49:50 · 76 阅读 · 0 评论 -
字符串匹配暴力解法
package 字符串问题;public class case13_字符串匹配暴力解法 { public static void main(String[] args) { String s="babababababb"; String p="bababb"; int index=match(s,p); System.out.println(index); } private static int match(S.翻译 2022-03-16 22:33:12 · 144 阅读 · 0 评论 -
题12:字符串匹配之Pabinkarp(优化)
package 字符串问题;import static java.lang.Math.pow;public class case12_字符串匹配之Pabinkarp下 { public static void main(String[] args) { String s="ABABABA";//源字符串 String p="ABA";//模式字符串 macth(p,s); } private static void mact.翻译 2022-03-16 22:04:01 · 104 阅读 · 0 评论 -
题12:字符串匹配Pabinkarp(上)
package 字符串问题;public class case12_字符串匹配之Pabinkarp { public static void main(String[] args) { String s="ABABABA";//源字符串 String p="BAB";//模式字符串 macth(p,s); } private static void macth(String p, String s) { long.翻译 2022-03-16 20:59:32 · 65 阅读 · 0 评论 -
题11:最短摘要的生成
题目:Alibaba笔试题:给定一段产品的英文描述,包含M个英文单词,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法String extractSurmary(String description, Stringkey words)。目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。思路:尺取法package 字符串问题;import java.util.Arrays;public c翻译 2022-03-14 22:14:09 · 70 阅读 · 0 评论 -
题10:神奇的回文串
回文串:"acbca"、1211package 字符串问题;public class case10_神奇的回文串 { public static void main(String[] args) { boolean res= isPalindrome("abcba"); System.out.println(res); palindromeNumber(); } public static boolean isPalindr翻译 2022-03-14 16:59:22 · 91 阅读 · 0 评论 -
题9:去掉连续出现的k个0
题目:移除字符串中连续出现的K个0思路:1.正则表达式2.扫描字符数组package 字符串问题;public class case09_去掉连续出现的k个0 { public static void main(String[] args) { //Assertions.assertThat(remove2("100001",3)).isEquals("101"); String s="10010001"; String re翻译 2022-03-14 16:31:13 · 67 阅读 · 0 评论 -
题8:按单词翻转字符串
题目:将"here you are"翻转为"are you here"思路:首先将字符串翻转,然后找到每个单词,对每个单词进行翻转。package 字符串问题;/** *将here you are翻转成are you here */public class case08_按单词翻转字符串 { public static void main(String[] args) { String res=reverse("here you are");翻译 2022-03-14 15:37:50 · 107 阅读 · 0 评论 -
题7:旋转词
题目:给定两个字符串s1和s2,要求判定s2是否能够被通过s1作循环移位(rotate)得到的字符串包含。例如,给定s1=AABCD和s2 =CDAA,返回 true;给定s1= ABCD和 s2= ACBD,返回false。思路:s1经过旋转得到b;b和b相加一定包含s2package 字符串问题;public class case07_旋转词 { public static void main(String[] args) { boolean res=chec翻译 2022-03-13 21:35:19 · 66 阅读 · 0 评论 -
题6:两个串的字符集是否相等
题目:只要出现的字符集相同就相等,不在乎数量。思路:借助辅助数组,先扫描第一个字符串,将出现的字符转换为辅助数组的下标并标记为1package 字符串问题;public class case06_两个串的字符集是否相等 { public static void main(String[] args) { boolean res=check("aasdf","azxcn"); System.out.println(res); boo翻译 2022-03-13 20:58:03 · 151 阅读 · 0 评论 -
题5:字符串的压缩
题目:利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。给定一个string iniString为待压缩的串(长度小于等于10000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。测试样例"aabcccccaaa"返回:"a2b1c5a3"思路:StringBuilder的用法package 字符串问题;pub翻译 2022-03-13 11:42:12 · 192 阅读 · 0 评论 -
题4:替换空格
题目:请编写一个方法,将字符串中的空格全部替换为“%20”"。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。给定一个string iniString 为原始的串,以及串的长度 int len,返回替换后的string。测试样例;"Mr John Smith",13返回:“Mr%20John%20Smith ””Hello World",12返回:”Hello%20%20World"思路:1.直接使用Jav.翻译 2022-03-13 11:04:50 · 63 阅读 · 0 评论 -
题3:变形词
题目:变形词;两个串有相同的字符及数量组成abc abc ,abc cba, aabcd bcada;给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。这里规定大小写为不同字符,旦考虑字符串中的空格。给定一个string stringA和一个string stringB,请返回一个bool,代表两串是否重新排列后可相同。保证两串的长度都小于等于5000,测试样例;"Here you are", ""Are you here" 返回: false思路:遍历翻译 2022-03-13 10:21:39 · 88 阅读 · 0 评论 -
题2:巧妙翻转字符串
题目:实现一个算法,翻转字符串。样例:“This is newcoder."输出:”redocwen si sihT"package 字符串问题;public class case02_翻转字符串 { public static void main(String[] args) { String s=new String("asdfg"); System.out.println(new case02_翻转字符串().reverseString(.翻译 2022-03-13 09:52:09 · 81 阅读 · 0 评论 -
题1:字符与数组问题
题目:实现一个算法,确定一个字符串的所有字符是否全都不同。假使不允许使用额外的数据结构,又该如何处理?解法:一开始,不妨先问问面试官,上面的字符串是ASCII字符串还是Unicode字符串。这很重要,问这个问题表明你关注细节,并且对计算机科学有深刻了解。为了简单起见,这里假定字符集为ASCII。若不是的话,则需扩大存储空间,不过其余逻辑没有分别。假定字符集为ASCIl,对于这个问题,我们可以做一个简单的优化,若字符串的长度大于字母表中的字符个数,则直接返回false。毕竟,若字母表只有256个字翻译 2022-03-13 09:21:10 · 90 阅读 · 0 评论 -
题7:矩阵的运算
题目:A:3 -1 21 5 72 4 5B:7 5 -25 1 94 2 1满足A+2X=B,求未知矩阵X。package 多维数组与矩阵;import java.util.Arrays;import java.util.Scanner;/** * M行N列 * 随后的M行每行由N个元素,每个元素用空格分开 */public class case07_矩阵运算 { public static void main(String[] args) {翻译 2022-03-12 22:10:36 · 178 阅读 · 0 评论 -
题6:子矩阵最大累加和
题目:给定一个矩阵matrix,其中的值有正、有负、有0,返回子矩阵的最大累加和。例如,matrix为︰-1 -1 -1-1 2 2-1 -1 -1其中最大累加和的子矩阵为︰2 2所以返回4。思路:以第一行作为起始行,每行按列相加时间复杂度O(n³)package 多维数组与矩阵;import java.util.Arrays;public class case06_子矩阵的最大累加和 { public static void main(String[]翻译 2022-03-12 21:29:01 · 65 阅读 · 0 评论 -
题5:求子数组的最大累加和
题目:给定一个数组arr,返回子数组的最大累加和例: arr=[1,-2,3,5,-2,6,-1];所有的子数组中[3,5,-2,6]可以累加出最大的和12,所以返回12思路:递推法,时间复杂度O(n)一直连续累加,如果累加和为负数则丢弃,为正数则保留,每次和max进行比较对max进行更新。package 多维数组与矩阵;import java.util.Date;public class case05_子数组的最大累加和 { public static void ma翻译 2022-03-12 20:16:56 · 107 阅读 · 0 评论 -
题4:边界为一的最大子方阵
题目:给定一个N×N的矩阵matrix,在这个矩阵中,只有0和1两种值,返回边框全是1的最大正方形的边长长度。思路:借助一个同样大小的三维数组,从右下角记录元素右边1的个数和左边1的个数时间复杂度由O(N的四次方)降低到O(N的立方)package 多维数组与矩阵;public class case04_边界为1的最大子方阵 { public static void main(String[] args) { int[][] A=new int[][]{翻译 2022-03-12 19:25:08 · 99 阅读 · 0 评论