
算法
文章平均质量分 68
qq_39435120
这个作者很懒,什么都没留下…
展开
-
反转字符串(字符串处理)
比较简单的一题,而且可以通过多种方法解决。思路1:使用递归。边界条件即为字符串的长度为1。public static String reverse1(String s) { if(s==null||s.length()==0) return s; return s.length()==1?s:reverse1(s.substring(1))+s...原创 2018-03-24 16:10:06 · 937 阅读 · 0 评论 -
求序列中最大连续子序列之和(递推)
题目:先读入一个数n,然后读入n个数,求n个数中最大连续子序列之和思路:直接递推即可。import java.util.Scanner;public class Main { public static void main(String []args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int a[] =...原创 2018-03-24 15:31:24 · 632 阅读 · 0 评论 -
求一个数的素数对个数(枚举、筛素数法)
题目:给定一个数n,求它可以是多少对不同的素数对相加之和。思路1:直接枚举,找出从2到n/2的素数,然后判断n与该素数的差是否为素数。实现非常简单,代码如下:import java.util.Scanner;public class Main { public static void main(String []args) { Scanner in = new Scanner(System.in...原创 2018-03-24 14:51:33 · 1054 阅读 · 1 评论 -
求大小为n的素数环(回溯法)
题目:将1~n的整数进行排列,使之两两相邻的数的和为素数,同时头尾相加也为素数,这样的排列成为素数环。输入一个n,请打印出所有的素数环。input:4output:2 1 4 3 2 3 4 1 3 2 1 4 3 4 1 2 思路:很经典的全排列算法,可以直接对1~n进行全排列,排列好后检查是否满足素数环的要求,但这样时间复杂度高达O(n!),我的电脑在当n=12时结果出的很慢了。这时可...原创 2018-03-25 17:15:29 · 480 阅读 · 0 评论 -
不用临时变量交换两个数(离散、位运算)
题目:不用临时变量交换两个数的值。思路1:先用其中一个变量存放它们的积,积除以另一个数即得原来的数。a = a * b;b = a / b;a = a / b;思路2:乘法可能会导致溢出,所以可以改用加法或减法,因为Java的整型采用补码,加减法即使溢出也不会导致被截掉,最后结果依然正确。a = a + b;b = a – b;a = a – b;思路3:如果熟悉位运算的话可以直接用^运算来代替,...原创 2018-03-25 22:08:59 · 204 阅读 · 0 评论 -
求上楼梯的方案总数(递推)
题目:有一个n级的楼梯,每次可以迈一步或者迈两步,那么上这个楼梯有多少种不同的方法?如2级的楼梯,可以迈两次一步,也可以迈一次两步,共有两种方法。 思路1:很容易就想到使用递归去求解。边界条件为楼梯1级时,共有一种方法,楼梯2级时,共有两种方法。publicstaticlong dfs(longl) { if(l==1) return 1; if(l==2) ...原创 2018-03-26 14:45:03 · 1213 阅读 · 0 评论 -
滑雪问题(记忆化搜索)
题目:Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子 1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11...原创 2018-03-28 17:41:50 · 3451 阅读 · 0 评论 -
求数对的排列(回溯法)
题目:今有7对数字,两个1,两个2,两个3,…两个7,把它们排成一行。 要求两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列: 17126425374635求出符合该要求的所有数字对排列 思路:回溯法的典型应用,对所有的数字对进行全排列,如果填充数字时不符合条件的话直接回溯即可。代码如下:public class Main { ...原创 2018-03-26 22:02:27 · 435 阅读 · 0 评论 -
第九届蓝桥杯国赛JavaB组第二题:最大乘积(全排列)
对于1~9的九个数字,我们往中间插入乘号,它们的乘积也可能是1~9组成的一个排列,如:132 * 965874 = 127495368135627 * 948 = 128574396612 * 954783 = 584327196 那么求它们的乘积最大是多少。 思路:直接对1~9执行全排列,每次拍好后尝试往中间插入乘号并计算它们的积,如果积只包含1~9且不存在重复数字,则与之前记录的最大值比较。p...原创 2018-05-29 14:43:14 · 1185 阅读 · 0 评论