当前位置: 首页 > news >正文

java实现排列组合

原文链接:JAVA实现组合、排列、重复排列(多层循环)

package com.champion.singleadmin;

import java.util.ArrayList;
import java.util.List;
public class CombineAndArrangement {

    private static ArrayList<Integer> tmpArr = new ArrayList<>();
    public static void main(String[] args) {
        int [] com = {1,2,3,4};
        int k = 3;
        if(k > com.length || com.length <= 0){
            return ;
        }
        System.out.println("组合结果:");
        combine(0 ,k ,com);
        System.out.println("\n排列结果:");
        arrangement(k,com);
        System.out.println("\n可重复排列结果:");
        repeatableArrangement(k, com);
    }

    /**
     * 组合
     * 按一定的顺序取出元素,就是组合,元素个数[C arr.len 3]
     * @param index 元素位置
     * @param k 选取的元素个数
     * @param arr 数组
     */
    public static void combine(int index,int k,int []arr) {
        if(k == 1){
            for (int i = index; i < arr.length; i++) {
                tmpArr.add(arr[i]);
                System.out.print(tmpArr.toString() + ",");
                tmpArr.remove((Object)arr[i]);
            }
        }else if(k > 1){
            for (int i = index; i <= arr.length - k; i++) {
                tmpArr.add(arr[i]); //tmpArr都是临时性存储一下
                combine(i + 1,k - 1, arr); //索引右移,内部循环,自然排除已经选择的元素
                tmpArr.remove((Object)arr[i]); //tmpArr因为是临时存储的,上一个组合找出后就该释放空间,存储下一个元素继续拼接组合了
            }
        }else{
            return ;
        }
    }

    /**
     * 排列
     * 按照无序(随机)的方式取出元素,就是排列,元素个数[A arr.len 3]
     * @param k 选取的元素个数
     * @param arr 数组
     */
    public static void arrangement(int k,int []arr){
        if(k == 1){
            for (int i = 0; i < arr.length; i++) {
                tmpArr.add(arr[i]);
                System.out.print(tmpArr.toString() + ",");
                tmpArr.remove((Object)arr[i]);
            }
        }else if(k > 1){
            for (int i = 0; i < arr.length; i++) { //按顺序挑选一个元素
                tmpArr.add(arr[i]); //添加选到的元素
                arrangement(k - 1, removeArrayElements(arr, tmpArr.toArray(new Integer[1]))); //没有取过的元素,继续挑选
                tmpArr.remove((Object)arr[i]);
            }
        }else{
            return ;
        }
    }

    /**
     * 可重复排列
     * 类似自己和自己笛卡尔积,类似k层循环拼接的结果,元素个数[arr.len^3]
     * @param k 选取的元素个数(k层循环)
     * @param arr 数组
     */
    public static void repeatableArrangement(int k,int []arr){
        if(k==1){
            for(int i=0;i<arr.length;i++){
                tmpArr.add(arr[i]);
                System.out.print(tmpArr.toString() + ",");
                tmpArr.remove(tmpArr.size()-1); //移除尾部元素
            }
        }else if(k >1){
            for(int i=0;i<arr.length;i++){
                tmpArr.add(arr[i]);
                repeatableArrangement(k - 1, arr); //不去重
                tmpArr.remove(tmpArr.size()-1); //移除尾部元素,不能用remove(Object),因为它会移除头部出现的元素,我们这里需要移除的是尾部元素
            }
        }else{
            return;
        }
    }

    /**
     * 移除数组某些元素(不影响原数组)
     * @param arr 数组
     * @param elements 待移除的元素
     * @return 剩余元素组成的新数组
     */
    public static int[] removeArrayElements(int[] arr, Integer... elements){
        List<Integer> remainList = new ArrayList<>(arr.length);
        for(int i=0;i<arr.length;i++){
            boolean find = false;
            for(int j=0;j<elements.length;j++){
                if(arr[i] == elements[j]){
                    find = true;
                    break;
                }
            }
            if(!find){ //没有找到的元素保留下来
                remainList.add(arr[i]);
            }
        }
        int[] remainArray = new int[remainList.size()];
        for(int i=0;i<remainList.size();i++){
            remainArray[i] = remainList.get(i);
        }
        return remainArray;
    }
}

转载于:https://www.cnblogs.com/cuiyf/p/10072178.html

相关文章:

  • Chisel 学习笔记(一)
  • database使用
  • 缓存技术在华为公有云环境中的挑战与应用
  • php的垃圾回收机制
  • 磕碰,擦伤了,紧急处理方法
  • 小程序如何动态修改标题navigationBarTitleText
  • Java调用第三方接口示范
  • Spring-boot和Spring-Cloud遇到的问题
  • IDEA破解图文教程
  • 搜索解决方案 -- ElasticSearch入门
  • 理解JSON Web Token (一)
  • 常用函数、文本处理函数、日期函数
  • VS code改英文
  • 怎样定制一款电视盒子软件系统
  • spring框架笔记
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Gradle 5.0 正式版发布
  • HTML中设置input等文本框为不可操作
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Java 网络编程(2):UDP 的使用
  • java8-模拟hadoop
  • javascript 哈希表
  • Laravel 菜鸟晋级之路
  • Lucene解析 - 基本概念
  • Mac转Windows的拯救指南
  • MySQL-事务管理(基础)
  • spring security oauth2 password授权模式
  • springboot_database项目介绍
  • 从零开始在ubuntu上搭建node开发环境
  • 经典排序算法及其 Java 实现
  • 如何选择开源的机器学习框架?
  • 树莓派 - 使用须知
  • 小程序开发中的那些坑
  • Python 之网络式编程
  • ​卜东波研究员:高观点下的少儿计算思维
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (一)插入排序
  • (译)2019年前端性能优化清单 — 下篇
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)C#调用WebService 基础
  • (转)memcache、redis缓存
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .Net 8.0 新的变化
  • .Net Memory Profiler的使用举例
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .net和php怎么连接,php和apache之间如何连接
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • [android] 看博客学习hashCode()和equals()
  • [HarekazeCTF2019]encode_and_encode 不会编程的崽
  • [Java基础]—JDBC