Java【全排列 算法 模板】
全排列模板-数组 | 2013年 第四届 蓝桥杯【带分数】 |
---|---|
全排列模板-字符数组 | 2014年 第五届 蓝桥杯【扑克排序】 |
全排列模板-无重复元素 | 2016年 第七届 蓝桥杯【凑算式】 |
全排列模板-数组
public class Main {public static void main(String[] args) {int arr1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};int arr2[] = {1, 2, 3};f(arr1, 0);}//确认某一个排列的第k位private static void f(int[] arr, int k) {if (k == arr.length) { //全部确认/*for(int x: arr) {System.out.print(x);}System.out.println();*///函数功能区return;}for (int i = k; i < arr.length; i++) { //选定第k位//将第i位和第k位交换int t = arr[i];arr[i] = arr[k];arr[k] = t;// 移交下一层去确认k+1位f(arr, k + 1);//回溯(换回来)t = arr[i];arr[i] = arr[k];arr[k] = t;}}
}
全排列模板-字符数组
import java.util.HashSet;
import java.util.Set;public class Main {static Set<String> set = new HashSet<String>();public static void main(String[] args) {char[] a = {'A', 'A', '2', '2', '3', '3', '4', '4'};f(a, 0);for (String x : set) { // 遍历set()System.out.println(x);}}private static void f(char[] a, int k) {if (k == a.length) {String s = new String(a);if (check(s)) {// System.out.println(s);set.add(s);}}for (int i = k; i < a.length; i++) {char t = a[k];a[k] = a[i];a[i] = t;f(a, k + 1);t = a[k];a[k] = a[i];a[i] = t;}}private static boolean check(String s) {if (***)return true;return false;}
}
全排列模板-无重复元素
public class Main {static int a[] = {};static int ans;static boolean check() {if (***)return true;return false;}//递归回溯生成全排列,适用于无重复元素的情况 考虑第k位,前面已经排定static void f(int k) {if (k == 数组的元素个数) { // 一种排列已经生成if (check())ans++;}// 从k往后的每个数字都可以放在k位for (int i = k; i < 数组的元素个数; ++i) {{int t = a[i];a[i] = a[k];a[k] = t;}f(k + 1); // 递归{int t = a[i];a[i] = a[k];a[k] = t;} // 回溯}}public static void main(String[] args) {f(0);System.out.println(ans);}
}
【带分数】题目详情
标题:带分数
100 可以表示为带分数的形式:100 = 3 + 69258 / 714还可以表示为:100 = 82 + 3546 / 197注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。类似这样的带分数,100 有 11 种表示法。
题目要求: 从标准输入读入一个正整数N (N<1000*1000) 程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!例如: 用户输入: 100 程序输出: 11
再例如: 用户输入: 105 程序输出: 6
资源约定: 峰值内存消耗(含虚拟机) < 64M CPU消耗 < 3000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
【带分数】题目解答
import java.util.Scanner;
//1-9 分別出现一次, 求带分数表示种数public class Main {static int ans; //全局变量private static int N;public static void main(String[] args) {Scanner sc = new Scanner(System.in);N = sc.nextInt();int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};// int[] arr = {1, 2, 3};f(arr, 0); //全排列函数System.out.println(ans);}//确认某一个排列的第k位private static void f(int[] arr, int k) {if (k == 9) { //全部确认check(arr);// print(arr);return;}//选定第k位,for (int i = k; i < arr.length; i++) {//将第i位和第k位交换int t = arr[i];arr[i] = arr[k];arr[k] = t;f(arr, k + 1); // 移交下一层 确认第k+1位//回溯(换回来) 不影响以后的取值//每一次计算, 都用初始值t = arr[i];arr[i] = arr[k];arr[k] = t;}}// private static void print(int[] arr) {// for (int i = 0; i < arr.length; i++) {// System.out.print(arr[i]);
// }
// System.out.println();
// }//枚举加号和除号的位置private static void check(int[] arr) {//+前的字符数最多是7for (int i = 1; i <= 7; i++) {int num1 = toInt(arr, 0, i); //+前面的一段整数if (num1 >= N) continue; //如果此时+号前的数值已经超过了N,没必要验算了// /前面的字符数for (int j = 1; j <= 8 - i; j++) {int num2 = toInt(arr, i, j);int num3 = toInt(arr, i + j, 9 - i - j);if (num2 % num3 == 0 && num1 + num2 / num3 == N) {ans++;}}}}//pos: 开始计算的位置; len:计算的长度(计算len次) 计算区间: [pos, pos + len -1]private static int toInt(int[] arr, int pos, int len) {int t = 1;int ans = 0;for (int i = pos + len - 1; i >= pos; i--) {ans += arr[i] * t;t *= 10;}return ans;}}
/**
int num1 = toInt(arr, 0, i); // "+"前面的一段整数
int num2 = toInt(arr, i, j); // "+"与"/"之间的整数
int num3 = toInt(arr, i + j, 9 - i - j); // "/"后面的整数100 = 3 + 69258 / 714
int num1 = toInt(arr, 0, 1);
int num2 = toInt(arr, 1, 5);
int num3 = toInt(arr, 1 + 5, 9 - 1 - 5);100 = 82 + 3546 / 197
int num1 = toInt(arr, 0, 2);
int num2 = toInt(arr, 2, 4);
int num3 = toInt(arr, 2 + 4, 9 - 2 - 4);*/
【扑克排序】题目详情
标题:扑克序列
A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。请填写出所有符合要求的排列中,字典序最小的那个。
例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。
请通过浏览器提交答案。“A”一定不要用小写字母a,也不要用“1”代替。字符间一定不要留空格。
答案:2342A3A4
【扑克排序】题目解答
import java.util.HashSet;
import java.util.Set;public class Main {static Set<String> set = new HashSet<String>();public static void main(String[] args) {char[] a = {'A', 'A', '2', '2', '3', '3', '4', '4'};f(a, 0);for (String x : set) { // 遍历set()System.out.println(x);}}private static void f(char[] a, int k) {if (k == a.length) {String s = new String(a);if (check(s)) {// System.out.println(s);set.add(s);}}for (int i = k; i < a.length; i++) {char t = a[k];a[k] = a[i];a[i] = t;f(a, k + 1);t = a[k];a[k] = a[i];a[i] = t;}}private static boolean check(String s) {if (s.lastIndexOf('A') - s.indexOf('A') == 2 && s.lastIndexOf('2') - s.indexOf('2') == 3 && s.lastIndexOf('3') - s.indexOf('3') == 4 && s.lastIndexOf('4') - s.indexOf('4') == 5)return true;return false;}
}
【凑算式】题目详情
凑算式
B DEF A + --- + ------- = 10C GHI(如果显示有问题,可以参见【图1.jpg】)这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如: 6+8/3+952/714 就是一种解法, 5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
答案:29
【凑算式】题目解答
public class Main { // 29static int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };static int ans;static boolean check() {int x = a[3] * 100 + a[4] * 10 + a[5];int y = a[6] * 100 + a[7] * 10 + a[8];if ((a[1] * y + a[2] * x) % (y * a[2]) == 0 && a[0] + (a[1] * y + a[2] * x) / (y * a[2]) == 10)return true;return false;}//递归回溯生成全排列,适用于无重复元素的情况 考虑第k位,前面已经排定static void f(int k) {if (k == 9) { // 一种排列已经生成if (check())ans++;}// 从k往后的每个数字都可以放在k位for (int i = k; i < 9; ++i) {{int t = a[i];a[i] = a[k];a[k] = t;}f(k + 1); // 递归{int t = a[i];a[i] = a[k];a[k] = t;} // 回溯}}public static void main(String[] args) {f(0);System.out.println(ans);}
}
全排列 模板
package Z;public class 全排列 {public static void main(String[] args) {int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };perm(a, 0, a.length);}public static void perm(int arr[], int start, int end) {if (start == end) {for (int temp : arr) {System.out.print(temp);}System.out.println();} else {for (int i = start; i < arr.length; i++) {swap(arr, start, i);perm(arr, start + 1, end);swap(arr, start, i);}}}public static void swap(int arr[], int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}
Java【全排列 算法 模板】相关推荐
- java全排列算法 递归算法_Java递归实现全排列
最近整理之前自己学习Java时的一些代码笔记,可能都是一些比较基础的Java知识,在这里只是给需要的人参考一下. 递归算法:将数据分为两部分,递归将数据从左侧移右侧实现全排列 package inte ...
- Java 全排列算法
优化前:public static void main(String[] args) {Integer l[] = {1,5,2};sort(l,0); }public static void sor ...
- 全排列的java算法_全排列算法原理和实现
评论 # re: 全排列算法原理和实现 回复 更多评论 #include #include #define CHESSNUM 9 using namespace std; /*********** ...
- 【蓝桥杯算法模板题--蓝桥题库Java】
PDF下载地址:点击即可 文章目录 ==算法模板== 1 排序(ArrayList,sort) 题目描述 输入描述 输出描述 输入输出样例 示例 1 运行限制 2 小明的彩灯(差分) 输入输出样例 示 ...
- 蓝桥杯——Java中的全排列算法
蓝桥杯--Java中的全排列 全排列的概念 排列 从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列.不同的顺序是一个不同的排列.从n个元素中取m ...
- Java刷算法:收藏大法
Java刷算法怎么刷:持续更新中 算法技巧 算法一轮复习 Java API复习 输入与输出 java.io.* java.util.* 数组 **判断二维数组是否为空** **数组拷贝** **字符数 ...
- java 全排列非递归算法_全排列的非递归算法 - osc_ivkc73ze的个人空间 - OSCHINA - 中文开源技术交流社区...
1.全排列的定义和公式: 从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列.由排列的定义,显然不同的顺序是一个不同的排列.从n个元素中取m个元素 ...
- java抽象类和模板模式_测试抽象类和模板方法模式
java抽象类和模板模式 摘自Wikipedia,"模板方法定义了算法的程序框架. 子类可以覆盖一个或多个算法步骤,以允许不同的行为,同时确保仍然遵循总体算法." 通常,此模式由两 ...
- 详讲全排列算法,及解决数字搭积木问题
如果你是做这道题不会,那么你可以看这道题的解题思路,如果你是不太理解全排列算法,那么你可以通过这个题来理解. 题目描述: 小明最近喜欢搭数字积木.一共有10块积木,每个积木上有一个数字,0~9. 搭积 ...
最新文章
- torch.backends.cudnn.deterministic 使用cuda保证每次结果一样
- 【转】android错误 aapt.exe已停止工作的解决方法
- 我们的解决方案:日志系统
- android调试是出现:Re-installation failed due to different application signatures
- 4.RabbitMQ 4种交换模式
- 【Python】Matplotlib切割图片
- 5个让IT开发效率提高200%的工具,最后一个很实用,你用过几个
- RedHat 救援模式下排错
- 为什么Zappos花钱让新员工走人?
- 【手指识别】基于matlab GUI指尖图像采集与检测【含Matlab源码 585期】
- git 查看修改明细_Git(查看修改记录)
- Android系统生成jks签名
- dll注册,但是对DllRegisterServer的调用失败,错误代码0x80070716
- 统计学中p值计算公式_统计学 z值 p值 问题 计算问题 在线急等
- 文献阅读笔记怎么写?
- unity使用easy ar制作ar红包
- Android工程中方法数超过65536解决方法
- adobe清理工具_Adobe终于通过其新的渐变工具实现了这一点-UX评论
- ASP.NET Web Service定时执行任务
- 函数原型中int *arr和int arr[]
热门文章
- mysql 查询帖子 用户_我要用sql查询出来,我所发布的帖子和我关注的用户发布的帖子,这个sql该怎么写啊?...
- 外部中断器1C语言程序,单片机C语言代码:外部中断,按下中断按键LED不亮,LED1正常亮...
- python输入水果求个数问题_水果爱好者:用Python解决一个简单的分类问题
- oracle中姓名取姓氏,Oracle SQL - 解析一個名稱字符串並將其轉換爲第一個姓氏和名字...
- html 定义函数调用函数,请问HTML function函数怎么定义和调用?
- 期末考试前的预习,科目:化工设备与反应器(4)
- 十九、 彻底掌握金融量化交易库Talib
- django view
- 决策树和随机森林(上)
- 最终篇!AAAI 2022值得读的NLP论文盘点