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.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/184371.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • [fastai]fastai Cookbook

    [fastai]fastai CookbookCourse url: http://www.fast.ai/ 1.Install fastai plugin in PyCharm IDE; 2.Import as: from fasta

  • 小龙女李若彤_网红为什么能成为网红

    小龙女李若彤_网红为什么能成为网红小龙女彤彤为何能红如何让营销推到网民心里去呢?最关键的就是你如何去读懂网民的心理,摸清楚哪里才是最需要推广的所在。以网络游戏为例,我们来看看如何正确选好角度进行营销推广。通过一个案例,我们来看一个成功的网络推广,从策划到实施要如何运作。 在2006年末,笔者开始尝试将

    2022年10月19日
  • Ubantu下通过iptables开放端口「建议收藏」

    Ubantu下通过iptables开放端口「建议收藏」1.iptablesan安装#检查是否安装@shylin:/etc#sudowhereisiptablesiptables:/sbin/iptables/usr/share/iptables/usr/share/man/man8/iptables.8.gz#安装sudoapt-getinstalliptables2.查看防火墙的配置信息root…

    2022年10月20日
  • JavaWeb之Request对象和Response对象详解

    JavaWeb之Request对象和Response对象详解一:概述Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象一、Response对象   1.Resonse的继承结构:         ServletResponse–HttpServletResponse   2.Response代表响应,于是响应消息中的状态码、响应头、实体

  • HDU 1002 A + B Problem II(大整数相加)[通俗易懂]

    HDU 1002 A + B Problem II(大整数相加)

  • tcping扫描所有端口_tcping端口检测工具使用

    tcping扫描所有端口_tcping端口检测工具使用大家都知道检测网络状态是,无论是服务器/客户机最常用的就是ping命令,但ping命令只能检测ICMP协议,若对方禁止ping协议了,自然ping命令也就无法检测了,此时,我们可以通过tcping工具以tcp/udp协议方式来代替ping命令检测网络延迟状况,于此同时,我们还可以监听对方开放了哪些端口等信息。windos下:1、安装tcping工具注:下载对应32位或64位的exe文件,后将文件…

发表回复

您的电子邮箱地址不会被公开。

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