第十四届蓝桥杯集训——练习解题阶段(无序阶段)-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全排列公式相关推荐

  1. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-988 逗志芃的危机

    第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-988 逗志芃的危机 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-988 逗志芃的危机 前言 关于数学的疑问 算法训练 逗 ...

  2. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-987 强力党逗志芃

    第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-987 强力党逗志芃 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-987 强力党逗志芃 前言 关于数学的疑问 算法训练 强 ...

  3. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 特殊回文数

    第十四届蓝桥杯集训--练习解题阶段(无序阶段)-基础练习 特殊回文数 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-基础练习 特殊回文数 前言 基础练习 特殊回文数 C语言 C++语言 Jav ...

  4. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-2 算法训练 最大最小公倍数

    第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-2 算法训练 最大最小公倍数 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-2 算法训练 最大最小公倍数 前言 算法训练 最 ...

  5. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 字母图形

    第十四届蓝桥杯集训--练习解题阶段(无序阶段)-基础练习 字母图形 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-基础练习 字母图形 前言 基础练习 字母图形 C语言 C++语言 Java语言 ...

  6. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 查找整数

    第十四届蓝桥杯集训--练习解题阶段(无序阶段)-基础练习 查找整数 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-基础练习 查找整数 前言 基础练习 查找整数 C语言 C++语言 Java语言 ...

  7. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 01字串

    第十四届蓝桥杯集训--练习解题阶段(无序阶段)-基础练习 01字串 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-基础练习 01字串 前言 基础练习 01字串 C语言 C++语言 Java语言 ...

  8. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-42 算法训练 送分啦

    第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-42 算法训练 送分啦 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-42 算法训练 送分啦 前言 算法训练 送分啦 C语言 ...

  9. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1007 印章

    第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-1007 印章 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-1007 印章 前言 关于数学的疑问 算法训练 印章 C语言 ...

最新文章

  1. PL/SQL编程:用while-loop-end循环算出5的阶乘
  2. 【计算机视觉】EmguCV学习笔记(2)图像的载入、显示和输出
  3. LeetCode 369. Plus One Linked List--链表--C++,Python解法
  4. 摩拜联合微信全国免押金骑行 这样的CP组合可以多来一点
  5. Spring--Redis入门集成配置
  6. 定时器表达式各组成部分详解
  7. php no input file specified.,nginx+php出现No input file specified解决办法
  8. 5渲染判断_云渲染怎么收费,5大云渲染平台实测,您选对了吗?
  9. linux文件夹重命名busy,Linux下执行程序出现 Text file busy 提示时的解决方法
  10. 干货 | 自然语言处理中注意力机制综述
  11. 181124每日一句
  12. win7纯净版系统哪里下载好
  13. 多款比较好用又免费的设计工具
  14. vue与微信小程序的写法对比
  15. 云计算进入多云时代 青云QingCloud如何帮企业做好多云管理?
  16. python代码示例大全 下载-python基础代码大全
  17. hexo页脚添加访客人数和总访问量
  18. BOS金蝶云星空开发简单账表
  19. 【新手向】Python做一个简易登录注册GUI界面(无事件绑定)
  20. vs code对python开发相关的设置

热门文章

  1. for循环输出“100-999的水仙花”数和“输出九九乘法表”
  2. 大工《金工实习(二)》大作业离线作业
  3. UOS台式机发射热点教程
  4. Ubuntu菜鸟入门(十五)—— 安装aras2下载软件
  5. 【联合选讲】「LibreOJ β Round #3」绯色 IOI(悬念)
  6. 接线端子02——接线端子-线鼻-线耳
  7. Mandriva下载
  8. 任天堂计划进入电子书战
  9. java无法引用int_Java中的“int不能被解除引用”
  10. SocksCapV2