java全排列递归算法_java排列组合代码实现

java全排列递归算法_java排列组合代码实现一、排列1、计算公式如下:2、使用方法,例如在1,2,3,4,5中取3个数排列:3、全排列当m=n时,结果为全排列。例如1,2,3,4的全排列如下:4、代码实现求无重复数组的全排列 /** *循环递归获取给定数组元素(无重复)的全排列 * *@paramoriList原始数组 *@paramoriLen原始数组size *@paramarrayCombResult数组排列结果集,可传null或空Set *@parampreList记录排列参数

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、排列

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.net/184371.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • AWS EC2文件上传[通俗易懂]

    AWS EC2文件上传[通俗易懂]AWSEC2申请配置、文件上传、nginx安装部署、tomcat安装和项目部署、域名绑定AWSEC2服务器申请配置我这里是参考简书的一篇博客:利用AWS的EC2来搭建属于自己的VPN服务器(MAC平台)在步骤4搭建vpn服务器之前都是可以通用的。非常的详细。文件上传经过以上配置之后应该了解到,使用ssh命令访问aws服务器是会用到其提供的秘钥文件的(我这里是serverK…

    2022年7月20日
    55
  • random.nextint java_实例讲解Java中random.nextInt()与Math.random()的基础用法

    random.nextint java_实例讲解Java中random.nextInt()与Math.random()的基础用法1、来源random.nextInt()为java.util.Random类中的方法;Math.random()为java.lang.Math类中的静态方法。2、用法产生0-n的伪随机数(伪随机数参看最后注解)://两种生成对象方式:带种子和不带种子(两种方式的区别见注解)Randomrandom=newRandom();Integerres=random.nextInt…

    2022年7月22日
    9
  • windows server 2008 web服务器搭建

    windows server 2008 web服务器搭建在众多小企业中,Web服务器的应用也需是最广泛的,企业网站的建立促进了服务器进驻中小企业,而Web服务器的建立也越来越多。而面对诸多的Web服务器应用系统,可以说是多种多样,有大家最熟悉的微软的IIS,也有开源的Apache,还有大型网站应用比较多的Unix,总之可以说是各有各的优点。  今天介绍的是,微软的IIS,因其图形界面的操作方式,给人以直观的操作感受,部署简便,是很多用户的首选,而Apache的部署要相对复杂,一般新手很难马上上手,所以这里先跟大家讲解一下IIS7.0的搭建Web服务器的方法。

    2022年5月28日
    38
  • 学习日志之synthesis and optimization(4)——banding and sharing

    学习日志之synthesis and optimization(4)——banding and sharing一个设计好的电路经过调度算法之后可以避免在时间上的一些限制,但是前面说的算法并没有涉及到硬件资源方面的constrains。在这里主要是开始进行资源的分配,这个过程在空间域上进行的资源与操作的绑定和分享。当然实际情况下并不仅仅需要考虑单一的时间域限制或是仅考虑空间域限制。而是需要两者同时考虑。要充分描述一个电路结构就需要以下一些元素:1.资源(resorces):用于在电路中实现各种算法…

    2022年10月9日
    0
  • Linux安装redis和部署

    Linux安装redis和部署Linux安装redis和部署第一步:下载安装包访问https://redis.io/download到官网进行下载。这里下载最新的6.2.6版本.第二步:安装1.通过远程管理工具,将压缩包拷贝到Linux服务器中,执行解压操作tar-zxfredis-4.0.9.tar.gz2.进入解压文件目录使用make对解压的Redis文件进行编译图示:这里因为我redis的安装目录在/usr/locat/目录下,因此会有如下操作注:如果在编译过程中出现问题,有可能是安

    2022年9月28日
    0
  • java调用ping命令_ping网址的命令格式

    java调用ping命令_ping网址的命令格式使用java 执行ping命令

    2022年4月21日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号