第十届蓝桥杯全国软件设计大赛
其中包括软件设计的基本数据结构与算法知识点,以及相关相关必备基本题目解法,以java解法为主
海伦•
求知若渴,大智若愚
展开
-
城市建设__最小生成树(Kruscal)
分析:构造最小生成树的时候需要用到道路的排序,所以对起始节点终止节点和道路花费进行封装,然后对边进行归并 然后依次归并最小花费价值的道路对应的节点 一条道路上当两个节点都被归并的时候不可以再次归并/***@author yangyvting*@date 2019年5月5日*/package 图论;import java.util.Arrays;import java...原创 2019-05-05 21:21:07 · 498 阅读 · 0 评论 -
拓扑排序
该图的有向拓扑图为: 分析:利用栈的思想,先将没有出度的点放入数组中 当有出度的点都处理之后,那么他就成为没有出度的点,所以,最后要将他本身也放入数组中,并且标记为已访问 最后返回最初开始的点的时候并没有完,而是继续进行下一个没有被访问的点/***@author yangyvting*@date 2019年5月5日*/package 图论;...原创 2019-05-05 18:05:32 · 222 阅读 · 0 评论 -
最小高度搜索树
分析:注意要有叶子结点,也就是当没有分配的数的时候应该讲它的后继赋值为空 由于要先构造左子树和右子树,在将他链接到p根节点中,所以在这种情况下要求要有返回值的函数 单用带参数的方法貌似也可以直接构造树题解为了便于查看题目多增加了,树的遍历,和数的层数最大求法。/***@author yangyvting*@date 2019年5月4日*/package 数结构;p...原创 2019-05-04 17:58:06 · 358 阅读 · 0 评论 -
最大数形支路和
分析:实质上就是深搜,但是与简单的递归不同的是我们对一个链表来进行递归的,所以要注意我们的下一跳与我们链表的结构相关联/***@author yangyvting*@date 2019年5月4日*/package 数结构;public class Main { public static int max = 0; public static void main(...原创 2019-05-04 17:02:07 · 177 阅读 · 0 评论 -
借一个栈对另一个栈进行排序
分析:就像模拟放圆盘一样,当大盘子不能放到小盘子上,若盘子太大不能放,就把小盘子放回,大盘子拿着找到合适的位置再放import java.util.Stack;public class Main { public static int numbers[] = {1,2,31,312,12,9}; public static void main(String[] args) ...原创 2019-05-02 19:52:16 · 112 阅读 · 0 评论 -
ArrayList及迭代器
注意Arrays的sort方法和Collections的sort方法的区别:Arrays是对数组的排序 Collections是对列表的排序 二者在对类进行排序的时候要去实现它的比较方法可比较下面一题和:贪心和类的排序import java.util.ArrayList;import java.util.Collections;import java.util.Iterato...原创 2019-04-30 09:11:48 · 139 阅读 · 0 评论 -
完全背包问题
01背包现在对题目的要求不是每种物体只有一个而是想要多个都有。所以讲01背包问题转化为完全背包问题。下面为完全背包的代码注意:这里因为要用到当行变化的情况。所以不能像01背包那样最后优化为一维数组。 状态转移方: if(j - w[i] >= 0){ dp[i][j] = max(dp[i -...原创 2019-04-28 10:52:58 · 163 阅读 · 0 评论 -
最长公共子序列(dp)
题目:求两个字符串的最长公共子序列(注意并不应要求是连续的哦)分析:用动态规划找出dp方程时注意要用到的是二位数组,因为当次循环可能会用到的是没有被改变的原始值,而不是动态变化的 dp方程:当找到匹配的一个字符串时 : dp [i][j] = max( dp[i - 1][j -1] + 1,dp[i - 1][j]); 当未有匹配的字符时 dp...原创 2019-04-27 21:40:08 · 624 阅读 · 0 评论 -
数字三角形(dp)
1,二维从上到下规划分析:如果用dfs,下面就会存在重叠求上方某一位置最大值的情况 这种情况下并没有重新开辟空间,一不失为一种好方法import java.util.Scanner;public class Main { public static int n; public static int a[][]; public static void main(...原创 2019-04-27 10:41:25 · 218 阅读 · 0 评论 -
购物最大价值物品(01背包)
动态规划:最优子问题 或者 子问题最优性的一般算法 找出dp方程 解决重叠子问题(减少求解次数)是记忆型递推、递归1.递归解决个人觉得这种方法更加容易理解重点是将无脑的递归转化为,有记忆形式的递归。(也就是去掉重复计算)也就是利用空间交换时间上的效率。import java.util.Scanner;public class Main { pu...原创 2019-04-26 21:35:10 · 380 阅读 · 0 评论 -
字典去最小问题(贪心)
Poj 3617Best Cow LineTime Limit:1000MS Memory Limit:65536K Total Submissions:38885 Accepted:10015 DescriptionFJ is about to take hisN(1 ≤N≤ 2,000) cows to the an...原创 2019-04-26 19:39:38 · 140 阅读 · 0 评论 -
过河 (贪心)
poj 1700过河时间限制:1000MS 内存限制:10000K 提交总数:22299 接受:8211 描述一群N人希望过一条只有一条船的河,最多可以载两个人。因此,必须安排某种穿梭布置,以便来回划船,以便所有人都可以穿越。每个人都有不同的划船速度;一对夫妇的速度取决于较慢的速度。您的工作是确定一种策略,以最大限度地缩短这些人的时间...原创 2019-04-26 10:57:12 · 488 阅读 · 0 评论 -
硬币问题(贪心)
动态规划和贪心算法都是一种递推的方法,当存在最优子结构的时候,用动态规划,贪心是动态规划的特例注意:那么当存在最的时候就要想到贪心和动态规划1.深度优先剪枝策略分析 :先按大的选,有结果就输出,没结果就倒退,选到出最佳方案后就就退出(剪枝)import java.util.Scanner;public class Main { public static int...原创 2019-04-25 11:12:20 · 831 阅读 · 0 评论 -
困难的子串
分析:char ch = (char) ('A' + i);时记得转为字符,否则会变为A0,A1字符串或者其他字符串 判断字符串是否为苦难字符串时直接用截取的方法看是否有重复且相邻的字符串没考虑到以B开头的代码import java.util.Scanner;public class Main { public static int n; //第n个最小困...原创 2019-04-24 09:19:29 · 139 阅读 · 0 评论 -
n皇后
分析 : 从上往下依次放入皇后,可以成功放满n个皇后,count++ 下一个无法放,则撤销一个,尝试,若仍然通再撤回,以此类推 将n的值可以改变来控制皇后的数量public class Main { public static int N = 8; public static int count = 0; public static boolean fa...原创 2019-04-24 08:05:52 · 150 阅读 · 0 评论 -
部分和
分析:用模式匹配方法,他类似于非空子集的求解方式 用递归的方法(两个选择,选和不选)类似于选硬币(选和不选)import java.util.ArrayList;public class Main { public static int[] a = {1, 2, 34, 5, 5}; public static int nl = a.length; public sta...原创 2019-04-23 21:05:16 · 152 阅读 · 0 评论 -
封闭形式的直接解
例:(转化为数学问题)汉罗塔:求它的移动次数的时候,就不用模拟移动过程 f(n ) = 2 f ( n - 1) + 1;用数学归纳法:对应值为: 1 3 7。。。 。。。 n - 1归纳得: f(n) = - 1证...原创 2019-04-23 20:26:50 · 1026 阅读 · 0 评论 -
合法括号
cc150 9.6分析:对于非数值型递归就得用容器去装啦 这里的Set就是几个去重的集合容器 生成一点装一点点,所谓迭代就是慢慢改变import java.util.HashSet;import java.util.Set;public class Main { public static void main(String[] args) { //Set为去重的集...原创 2019-04-23 15:23:30 · 284 阅读 · 0 评论 -
机器人走格子(递归 / 动态规划)
cc150 9.2分析:动态规划是有小到大得进行 递归表面从大到小,实际从小到大import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sca = new Scanner(System.in); int x = sca.nextIn...原创 2019-04-23 14:55:21 · 1067 阅读 · 0 评论 -
走楼梯
来自cc150 9.1分析:递归将由简单到复杂 如果次数明确的情况下选择迭代方法import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sca = new Scanner(System.in); int n ...原创 2019-04-23 09:50:39 · 512 阅读 · 0 评论 -
快速幂运算
快速设计一个a的n次幂的算法 利用二进制进行巧算public class Main { public static void main(String[] args) { //求a的n次方 int a = 12; int n = 10; //m与n进行相与来判断对应的mt是否应该乘入res结果 ...原创 2019-04-23 08:44:06 · 97 阅读 · 0 评论 -
第十万个素数(埃式筛法)
知识点:整数n内大概有n/log(n)个素数 埃式筛法:从左到右,遇到素数,将素数的倍数标记为非素数,然后继续这样筛。 特别当素数个数要求求的次数非常多,就特别推荐埃式筛法public class Main { public static boolean arr[] ; public static void main(String[] args) { //求第N个质数 ...原创 2019-04-23 08:15:51 · 683 阅读 · 1 评论 -
质因数分解
只需 判断到根号n出,就可以知道该数是否为质数 当从最小质因子去重之后后面较小的非质数就不可能成为他的因子。所以说最后他的因子都是质数。(数论)public class Main{ public static void main(String[] args) { int n = 100; Map<Integer, Integer> map = new Ha...原创 2019-04-22 21:37:50 · 228 阅读 · 0 评论 -
欧几里得法
大神的思想:一行解决最大公约数(递归调用自己)求两个数的最大公约数:辗转相除法public class Main { public static void main(String[] args) { int a = 344; int b = 44; int x; // a > b x = gcd(a,b); System.out.println(...原创 2019-04-22 21:04:44 · 178 阅读 · 0 评论 -
必备求和公式
原创 2019-04-22 20:03:12 · 456 阅读 · 0 评论 -
阶梯尼姆博弈
Georgia and BobPOJ - 1704运行超时代码:import java.util.Arrays;import java.util.Scanner;//时间超时public class Main { public static int n; public static int a[][]; public static void main(St...原创 2019-04-22 19:59:10 · 258 阅读 · 0 评论 -
Nim游戏(博弈)
分析:利用数论得出的公式:当先开始拿的人,面对的结果异或不为0,那么他就可以把结果异或为零,最终他会赢 反之,先开始拿的人面对的是时异或为0,那么他的对手总可以把结果异或为0,最终他的对手会赢。import java.util.Scanner;public class Main { public static int n; public static void main...原创 2019-04-22 17:23:46 · 182 阅读 · 0 评论 -
天平称重(巧用三进制)
分析:对砝码的放左放右,还是不放,可以最后用1,-1,0表示,类似于二进制的1表示放,0表示不放。 结果变化的时候利用进位的思想。当为2时接一位低位,进一位高位。import java.util.ArrayList;import java.util.Scanner;public class Main { public static int n; ...原创 2019-04-22 17:04:32 · 442 阅读 · 0 评论 -
hiho字符串
/* hiho字符串时间限制:10000ms单点时限:1000ms内存限制:256MB描述如果一个字符串恰好包含2个'h'、1个'i'和1个'o',我们就称这个字符串是hiho字符串。 例如"oihateher"、"hugeinputhugeoutput"都是hiho字符串。现在给定一个只包含小写字母的字符串S,小Hi想知道S的所有子串中,最短的hiho字符串是哪个。输入...原创 2019-04-21 17:08:01 · 117 阅读 · 0 评论 -
字符串匹配__RabinKarp
Michael O. Rabin和Richard M. Karp在1987年提出一个想法,即可以对模式串进行哈希运算并将其哈希值与文本中子串的哈希值进行比对。总的来说这一想法非常浅显,唯一的问题在于我们需要找到一个哈希函数 ,它需要能够对不同的字符串返回不同的哈希值。例如,该哈希函数可能会对每个字符的ASCII码进行算,但同时我们也需要仔细考虑对多语种文本的支持。...原创 2019-04-20 21:28:45 · 169 阅读 · 0 评论 -
将字符串按单词翻转(str.split(" "))
分析:这里可以使用a.split(" ")可以快速分割单词public class Main { public static void main(String[] args) { String a = "Here you are!"; //切割单词 String word[] = a.split(" "); int n = word.length...原创 2019-04-20 20:40:21 · 208 阅读 · 0 评论 -
替换字符串中的空格( str.replaceAll)
如果了解API直接使用下面方法方法一:public class Main { public static void main(String[] args) { String a = "a fk dv",b; b = a.replaceAll("\\s", "%20"); System.out.println(b); }}运行结果:a%20f...原创 2019-04-20 20:06:15 · 1777 阅读 · 0 评论 -
巧妙翻转字符串(StringBuffer /StringBuilder)
直接使用javaAPI中的StringBuffer或者StringBuilder(可变字符串)巧妙方法一:public class Main { public static void main(String[] args) { StringBuffer stbuf = new StringBuffer("asdf"); System.out.println(stbuf....原创 2019-04-20 19:48:05 · 253 阅读 · 0 评论 -
判断字符串有无重复字符(ASCII码和Unicode的区别)
来自cc150分析:ASCII码和Unicode的区别1.ASCII的特点ASCII 是用来表示英文字符的一种编码规范。每个ASCII字符占用1 个字节,因此,ASCII 编码可以表示的最大字符数是255(00H—FFH)。这对于英文而言,是没有问题的,一般只什么用到前128个(00H--7FH,最高位为0)。而最高位为1 的另128 个字符(80H—FFH)被...原创 2019-04-20 19:27:19 · 1334 阅读 · 0 评论 -
矩阵与矩阵的乘法运算
分析:a矩阵的行为ab矩阵的行数 b矩阵的列数为ab矩阵得列数 将乘的次数为a矩阵的列数,= b矩阵的行数public class Main { public static int a[][] = { {1,2}, {1,-1} }; public static int b[][] = {...原创 2019-04-20 17:38:09 · 4087 阅读 · 0 评论 -
子阵最大累加和(dp)
分析:如果直接用暴力法,时间复杂度可以达到0(*) 但行用到dp的方法可以将时间复杂度降到O(*n)public class Main { public static int a[][] = { {1,1,1,1,1,1}, {1,0,0,0,1,1}, {1,0,0,0,1,1}, {1,0,0,0,1,1}, {...原创 2019-04-20 17:06:10 · 122 阅读 · 0 评论 -
边界为1的最大子方阵(模拟+动态规划)
分析:这里不使用直接暴力枚举的方法,而是使用最大最先算的最优算法。这里的思考方式值得学习。方法一:使用模拟的方法,模拟寻找过程(从大到小顺序查找,找到就停止)public class Main { public static int a[][] = { {1,1,1,1,1,1}, {1,0,0,0,1,1}, {1,0,0,0,1,1}, {1,0,0,0,1,...原创 2019-04-19 17:41:12 · 588 阅读 · 0 评论 -
顺时针打印二维数组
分析:看变化:变化的是上下左右边界 简化:首先打出第一行,注意没打出一点就检验一遍,这样有减少错误复杂度 具体实现:套上外层循环public class Main { public static int a[][] = { {1,2,3,4}, {5,6,7,8}, {9,20,11,12}, {13,14,15,16} }; public sta...原创 2019-04-19 16:37:11 · 264 阅读 · 0 评论 -
Z形打印(模拟)
分析:将模型简单化,分为向斜上方走和向斜下方走,当遇到边界时就处理当步该走方向 变化整体方向 flag = !flagpublic class Main { public static int a[][] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; public static void main(String[] a...原创 2019-04-19 16:35:52 · 191 阅读 · 0 评论 -
计数排序
分析:当数字范围一定,规模比较大的情况下我们可以采用以空间换时间的方法(计数排序)import java.util.Arrays;public class Main { public static int n = 10000000; public static int a[] = new int[10000001]; public static int b[] = new int...原创 2019-04-18 15:54:58 · 88 阅读 · 0 评论