java全排列递归算法_java排列组合代码实现
2023-06-13 09:11:13 时间
一、排列
1、计算公式如下:
2、使用方法,例如在1,2,3,4,5中取3个数排列:
3、全排列 当m=n时,结果为全排列。例如1,2,3,4的全排列如下:
4、代码实现求无重复数组的全排列
/** * 循环递归获取给定数组元素(无重复)的全排列 * * @param oriList 原始数组 * @param oriLen 原始数组size * @param arrayCombResult 数组排列结果集,可传null或空Set * @param preList 记录排列参数,可传null或空List * @return 排列结果 */
public static Set<String> getArrange(List oriList, int oriLen, Set<String> arrayCombResult, List preList){
if (oriList == null){
return arrayCombResult;
}
if (arrayCombResult == null){
arrayCombResult = new HashSet<>();
}
if (preList == null){
preList = new ArrayList();
}
for (int i = 0; i < oriList.size(); i++){
while(preList.size() > 0 && oriList.size() + preList.size() > oriLen){
preList.remove(preList.size() - 1);
}
List arrList = new ArrayList(oriList);
preList.add(arrList.get(i));
arrList.remove(i);
if (arrList.isEmpty()){
arrayCombResult.add(getStrFromList(preList));
}else {
getArrange(arrList, oriLen, arrayCombResult, preList);
}
}
return arrayCombResult;
}
二、组合
1、计算公式如下:
2、使用方法,例如在1,2,3,4,5中取3个数组合:
3、代码实现求无重复数组的所有组合
/** * 循环递归获取给定数组元素(无重复)的所有组合 * * @param oriList 原始数组 * @param resultSet 元素组合结果,可传null或空set * @return 组合结果 */
public static Set<String> getCombination(List oriList, Set<String> resultSet) {
if (oriList == null) {
return resultSet;
}
if (resultSet == null){
resultSet = new HashSet<>();
}
for (int i = 0; i < oriList.size(); i++) {
List copyList = new ArrayList(oriList);
resultSet.add(getStrFromList(copyList));
List removeIList = new ArrayList();
copyList.remove(i);
removeIList.addAll(copyList);
getCombination(removeIList, resultSet);
}
return resultSet;
}
三、开发应用
1、场景1:直接输出1,2,3,4的所有组成可能。 ①思路:循环递归,直接打印 ②代码实现(本地创建名为EffArrange的class文件后,复制粘贴可直接执行):
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
/** * 数组所有排列 * * @author ansel * @date 2020/5/26 1:08 PM */
public class EffArrange {
public static void main(String[] args) {
String[] array = new String[] {
"1", "2", "3", "4"};
arrangeAll(Arrays.asList(array), "");
}
public static void arrangeAll(List array, String prefix){
System.out.println(prefix);
for (int i = 0; i < array.size(); i++) {
List temp = new LinkedList(array);
arrangeAll(temp, prefix + temp.remove(i));
}
}
}
2、场景2:列出 ”我“ ”爱“ ”编“ ”码“ 四个字所有的组成可能,并返回。 ①思路:先求四个字的所有组合可能,再对每种可能全排列。 ②代码实现(本地创建名为Arrange的class文件后,复制粘贴可直接执行):
import java.util.*;
/** * 对给定数组元素(无重复)进行排列 * * @author ansel * * @date 2020/5/26 1:23 PM */
public class Arrange {
public static void main(String[] args) {
String[] array = new String[] {
"我", "爱", "编", "码"};
List arrayList = Arrays.asList(array);
Set<String> resultSet = new HashSet<>();
getCombination(arrayList, resultSet);
System.out.println("组合数 = " + resultSet.size());
System.out.println("所有组合 : " + resultSet);
Set<String> arrayCombResult = new HashSet<>();
Iterator<String> iterator = resultSet.iterator();
while (iterator.hasNext()){
List arrList = Arrays.asList(iterator.next().split(","));
getArrange(arrList, arrList.size(), arrayCombResult, null);
}
System.out.println("排列数 = " + arrayCombResult.size());
System.out.println("所有排列 : " + arrayCombResult);
}
/** * 循环递归获取给定数组元素(无重复)的全排列 * * @param oriList 原始数组 * @param oriLen 原始数组size * @param arrayCombResult 数组排列结果集,可传null或空Set * @param preList 记录排列参数,可传null或空List * @return 排列结果 */
public static Set<String> getArrange(List oriList, int oriLen, Set<String> arrayCombResult, List preList){
if (oriList == null){
return arrayCombResult;
}
if (arrayCombResult == null){
arrayCombResult = new HashSet<>();
}
if (preList == null){
preList = new ArrayList();
}
for (int i = 0; i < oriList.size(); i++){
while(preList.size() > 0 && oriList.size() + preList.size() > oriLen){
preList.remove(preList.size() - 1);
}
List arrList = new ArrayList(oriList);
preList.add(arrList.get(i));
arrList.remove(i);
if (arrList.isEmpty()){
arrayCombResult.add(getStrFromList(preList));
}else {
getArrange(arrList, oriLen, arrayCombResult, preList);
}
}
return arrayCombResult;
}
/** * 循环递归获取给定数组元素(无重复)的所有组合 * * @param oriList 原始数组 * @param resultSet 元素组合结果,可传null或空set * @return 组合结果 */
public static Set<String> getCombination(List oriList, Set<String> resultSet) {
if (oriList == null) {
return resultSet;
}
if (resultSet == null){
resultSet = new HashSet<>();
}
for (int i = 0; i < oriList.size(); i++) {
List copyList = new ArrayList(oriList);
resultSet.add(getStrFromList(copyList));
List removeIList = new ArrayList();
copyList.remove(i);
removeIList.addAll(copyList);
getCombination(removeIList, resultSet);
}
return resultSet;
}
/** * 将数组元素转化为逗号分隔的字符串 * * @param oriList 原始数组 * @return 字符串 */
public static String getStrFromList(List oriList){
StringBuffer result = new StringBuffer();
if (oriList == null){
return result.toString();
} else {
for (int i = 0; i < oriList.size(); i++){
result.append(oriList.get(i));
if (i != (oriList.size() - 1)){
result.append(",");
}
}
}
return result.toString();
}
}
—— Copyright © 2020 Ansel. All rights reserved.
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/184371.html原文链接:https://javaforall.cn
相关文章
- Java菜鸟教程 递归算法与Scanner类「建议收藏」
- java启动器_JAVA基础:Java 启动器如何查找类
- java环境_Java 开发环境配置
- java冒泡排序经典代码_Java 8大经典排序算法(含源代码),必须收藏!
- java的运行环境是什么_Java运行环境是什么
- Java递归调用_递归算法1加到100
- Java算法大全_java贪心算法几个经典例子
- java实现递归树形结构_java递归算法经典实例
- java 数字信封_【Java密码学】使用Bouncy Castle生成数字签名、数字信封
- 三面“有赞”Java岗斩获offer:Spring+JVM+并发锁+分布式+算法
- java日期遍历详解编程语言
- Java实现的各种排序算法(包括冒泡,快排等)详解编程语言
- Java数据结构和算法(八)——递归详解编程语言
- Java多线程编程——进阶篇二详解编程语言
- 注册MySQL,让你的Java技能更上一层楼(java注册mysql)
- 服务Linux启动Java服务:一步步去完成(linux启动java)
- 写入数据Java实现MySQL数据写入(java向mysql)
- 客户端建立Redis集群:Java客户端指南(redis集群java)
- 处理处理Java中Redis缓存过期策略(redisjava过期)
- 时间处理处理Redis Java键的自动过期方法(redisjava过期)
- 检测Redis Java过期数据检测实践(redisjava过期)
- 如何使用Java备份Oracle数据库?(java备份oracle)
- 进程Linux下创建多个Java进程的简易方法(linux 多个java)
- Java加速Oracle开发之旅(java中oracle包)
- Java实现Redis计数器功能(redis计数 java)
- java中关于Map的三种遍历方法详解
- Java线程优先级示例代码