第十四届蓝桥杯集训——练习解题阶段(无序阶段)-Java全排列公式
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-Java全排列公式
前言
最近的一些文章都可能会很碎,写到哪里是哪里,过一阵子会具体的整理一遍,这里其它的类型题先往后排一排,因为蓝桥最后考的也就是对题目逻辑的理解能力,也就是dp分析能力了,所以就主要目标定在这里,最近的题目会很散,很多,基本上都是网罗全网的一些dp练习题进行二次训练,准备比赛的学生底子薄的先不建议看啊,当然,脑子快的例外,可以直接跳过之前的一切直接来看即可,只需要你在高中的时候数学成绩还可以那就没啥问题,其实,dp就是规律总结,我们只需要推导出对应题目的数学规律就可以直接操作,可能是一维数组,也可能是二维数组,总体来看二维数组的较多,但是如果能降为的话建议降为,因为如果降为起来你看看时间复杂度就知道咋回事了,那么在这里祝大家能无序的各种看明白,争取能帮助到大家。
全排列题目要求
题目解析
从字符串数组中每次选取一个元素,作为结果中的第一个元素;然后,对剩余的元素全排列
全排列
从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
公式:全排列数f(n)=n!(定义0!=1)
例如:如果是对任意的三个字符进行全排列,也就是3!=6,当然,如果是相同的就只有1次
String s="我爱你";
三个字符,全排列,6中结果
我爱你
我你爱
爱我你
爱你我
你爱我
你我爱三个相同字符串,就一次
爱爱爱
那么我们要编辑出这种排列方法:
首先判断是否字符串相同:
方案1:
package com.item.action;public class Demo1 {public static void main(String[] args) {// TODO Auto-generated method stubString s = "说说说说说";for (int j = 0; j < 10; j++) {long start = System.nanoTime();char[] cs = s.toCharArray();// 我们要判断字符串中是否有不相同的字符boolean isf=false;for (int i = 0; i < cs.length - 1; i++) {if (cs[i] != cs[i + 1]) {isf=true;break;}}long end = System.nanoTime();System.out.println("char数组消耗时间:" + (end - start));System.out.println(isf?"字符串不相同":"字符串都相同");}}}
消耗时间:
方案2:
package com.item.action;public class Demo2 {public static void main(String[] args) {// TODO Auto-generated method stubString s = "说说说说说";for (int j = 0; j < 10; j++) {long start = System.nanoTime();// 我们要判断字符串中是否有不相同的字符boolean isf=false;for (int i = 0; i < s.length()-1; i++) {if (s.charAt(i) != s.charAt(i+1)) {isf=true;break;}}long end = System.nanoTime();System.out.println("charAt消耗时间:" + (end - start));System.out.println(isf?"字符串不相同":"字符串都相同");}}}
消耗时间
根据方案1与方案2对比,我们知道charAt相对效率较高,我们使用第二种方法。
全排列示例代码
package com.item.action;import java.util.ArrayList;public class Demo3 {public static void main(String[] args) {// TODO Auto-generated method stubString s = "说你爱我";// 先进行判断是否相同字符串,后进行全排列// 我们这里操作的都是char所以使用==,如果使用字符串s.equals(str)boolean isf = true;for (int i = 0; i < s.length() - 1; i++) {if (s.charAt(i) != s.charAt(i + 1)) {isf = false;break;}}if (isf) {System.out.println(s);// 因为只有1种排列return;}// 全排列f(s.toCharArray(), 0, s.length() - 1);}private static void f(char[] cs, int from, int to) {// TODO Auto-generated method stub// 写递归先写终止条件if (from == to) {System.out.println(cs);}for (int i = from; i <= to; i++) {// 交换节点changeIndex(cs, i, from);// 递归·排序f(cs, from + 1, to);// 还原节点changeIndex(cs, from, i);}}private static void changeIndex(char[] cs, int from, int to) {// TODO Auto-generated method stubchar temp = cs[from];cs[from] = cs[to];cs[to] = temp;}
}
六种
判断是否正确
根据【公式:全排列数f(n)=n!(定义0!=1)】判断是否全排列完成。
示例字符串【说你爱我】,4个字。
阶乘可得:
package com.item.action;public class Demo4 {public static void main(String[] args) {// TODO Auto-generated method stub//计算阶乘System.out.println(dfs(4));}private static int dfs(int i) {// TODO Auto-generated method stubif(i==1) {return 1;}return i*dfs(i-1);}}
阶乘结果:
全排列代码验证:
package com.item.action;import java.util.ArrayList;public class Demo3 {static ArrayList<char[]> list = new ArrayList<>();public static void main(String[] args) {// TODO Auto-generated method stubString s = "说你爱我";// 先进行判断是否相同字符串,后进行全排列// 我们这里操作的都是char所以使用==,如果使用字符串s.equals(str)boolean isf = true;for (int i = 0; i < s.length() - 1; i++) {if (s.charAt(i) != s.charAt(i + 1)) {isf = false;break;}}if (isf) {System.out.println(s);// 因为只有1种排列return;}// 全排列f(s.toCharArray(), 0, s.length() - 1);System.out.println("长度:"+list.size());}private static void f(char[] cs, int from, int to) {// TODO Auto-generated method stub// 写递归先写终止条件if (from == to) {System.out.println(cs);list.add(cs);}for (int i = from; i <= to; i++) {// 交换节点changeIndex(cs, i, from);// 递归·排序f(cs, from + 1, to);// 还原节点changeIndex(cs, from, i);}}private static void changeIndex(char[] cs, int from, int to) {// TODO Auto-generated method stubchar temp = cs[from];cs[from] = cs[to];cs[to] = temp;}
}
验证结果,通过:
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-Java全排列公式相关推荐
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-988 逗志芃的危机
第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-988 逗志芃的危机 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-988 逗志芃的危机 前言 关于数学的疑问 算法训练 逗 ...
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-987 强力党逗志芃
第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-987 强力党逗志芃 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-987 强力党逗志芃 前言 关于数学的疑问 算法训练 强 ...
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 特殊回文数
第十四届蓝桥杯集训--练习解题阶段(无序阶段)-基础练习 特殊回文数 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-基础练习 特殊回文数 前言 基础练习 特殊回文数 C语言 C++语言 Jav ...
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-2 算法训练 最大最小公倍数
第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-2 算法训练 最大最小公倍数 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-2 算法训练 最大最小公倍数 前言 算法训练 最 ...
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 字母图形
第十四届蓝桥杯集训--练习解题阶段(无序阶段)-基础练习 字母图形 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-基础练习 字母图形 前言 基础练习 字母图形 C语言 C++语言 Java语言 ...
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 查找整数
第十四届蓝桥杯集训--练习解题阶段(无序阶段)-基础练习 查找整数 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-基础练习 查找整数 前言 基础练习 查找整数 C语言 C++语言 Java语言 ...
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 01字串
第十四届蓝桥杯集训--练习解题阶段(无序阶段)-基础练习 01字串 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-基础练习 01字串 前言 基础练习 01字串 C语言 C++语言 Java语言 ...
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-42 算法训练 送分啦
第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-42 算法训练 送分啦 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-42 算法训练 送分啦 前言 算法训练 送分啦 C语言 ...
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1007 印章
第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-1007 印章 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-1007 印章 前言 关于数学的疑问 算法训练 印章 C语言 ...
最新文章
- PL/SQL编程:用while-loop-end循环算出5的阶乘
- 【计算机视觉】EmguCV学习笔记(2)图像的载入、显示和输出
- LeetCode 369. Plus One Linked List--链表--C++,Python解法
- 摩拜联合微信全国免押金骑行 这样的CP组合可以多来一点
- Spring--Redis入门集成配置
- 定时器表达式各组成部分详解
- php no input file specified.,nginx+php出现No input file specified解决办法
- 5渲染判断_云渲染怎么收费,5大云渲染平台实测,您选对了吗?
- linux文件夹重命名busy,Linux下执行程序出现 Text file busy 提示时的解决方法
- 干货 | 自然语言处理中注意力机制综述
- 181124每日一句
- win7纯净版系统哪里下载好
- 多款比较好用又免费的设计工具
- vue与微信小程序的写法对比
- 云计算进入多云时代 青云QingCloud如何帮企业做好多云管理?
- python代码示例大全 下载-python基础代码大全
- hexo页脚添加访客人数和总访问量
- BOS金蝶云星空开发简单账表
- 【新手向】Python做一个简易登录注册GUI界面(无事件绑定)
- vs code对python开发相关的设置