赞
踩
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.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。