JAVA实现组合、排列、重复排列(多层循环)
1.代码
- package com.hdwang;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- /**
- * Created by hdwang on 2017-10-25.
- * 组合、排列、可重复排列
- */
- 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;
- }
- }
2.运行结果
组合结果:
[1, 2, 3],[1, 2, 4],[1, 3, 4],[2, 3, 4],
排列结果:
[1, 2, 3],[1, 2, 4],[1, 3, 2],[1, 3, 4],[1, 4, 2],[1, 4, 3],[2, 1, 3],[2, 1, 4],[2, 3, 1],[2, 3, 4],[2, 4, 1],[2, 4, 3],[3, 1, 2],[3, 1, 4],[3, 2, 1],[3, 2, 4],[3, 4, 1],[3, 4, 2],[4, 1, 2],[4, 1, 3],[4, 2, 1],[4, 2, 3],[4, 3, 1],[4, 3, 2],
可重复排列结果:
[1, 1, 1],[1, 1, 2],[1, 1, 3],[1, 1, 4],[1, 2, 1],[1, 2, 2],[1, 2, 3],[1, 2, 4],[1, 3, 1],[1, 3, 2],[1, 3, 3],[1, 3, 4],[1, 4, 1],[1, 4, 2],[1, 4, 3],[1, 4, 4],[2, 1, 1],[2, 1, 2],[2, 1, 3],[2, 1, 4],[2, 2, 1],[2, 2, 2],[2, 2, 3],[2, 2, 4],[2, 3, 1],[2, 3, 2],[2, 3, 3],[2, 3, 4],[2, 4, 1],[2, 4, 2],[2, 4, 3],[2, 4, 4],[3, 1, 1],[3, 1, 2],[3, 1, 3],[3, 1, 4],[3, 2, 1],[3, 2, 2],[3, 2, 3],[3, 2, 4],[3, 3, 1],[3, 3, 2],[3, 3, 3],[3, 3, 4],[3, 4, 1],[3, 4, 2],[3, 4, 3],[3, 4, 4],[4, 1, 1],[4, 1, 2],[4, 1, 3],[4, 1, 4],[4, 2, 1],[4, 2, 2],[4, 2, 3],[4, 2, 4],[4, 3, 1],[4, 3, 2],[4, 3, 3],[4, 3, 4],[4, 4, 1],[4, 4, 2],[4, 4, 3],[4, 4, 4],
JAVA实现组合、排列、重复排列(多层循环)的更多相关文章
- Java的组合排列问题
从4个人中选2个人参加活动,一共有6种选法. 从n个人中选m个人参加活动,一共有多少种选法?C(m/n)=C((m-1)/(n-1))+C(m/(n-1))数学算法 public class Main ...
- java的break跳出多层循环
记得大一的时候,语言学的不好,碰到了需要跳出双层循环的时候,就没有了办法.因为老师讲了goto然后说不要用goto... 自己就一直感觉这种跳出多层循环的想法是不可取的(好蠢) 下面用java代码的 ...
- JAVA如何跳出多层循环
1. break.continue.return 的区别: break默认是跳出最里层的循环,也就是break所在的最近的那层循环 continue是终止本次循环,继续下次循环 return 结束当前 ...
- Java语法基础(四)----循环结构语句
一.循环结构: 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则 ...
- 关于python如何简单跳出多层循环
上述代码的逻辑是,在跳出子循环之前定义一个变量flag为Ture,第一层循环跳出之后,如果要跳出第二个循环,直接调用变量flag,可以直接跳出第二层循环.这里要注意的是缩进,不然会出错误. 如果是多层 ...
- Java设计模式——组合模式
JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...
- 九天学会Java,第四天,循环结构
变量和数据类型,赋值和输出 算术运算 选择结构 循环结构 函数定义,函数调用 变量作用域 栈,程序运行的基石 面向对象 异常处理 语言提供的公用包 这次我们讲Java的循环结构.循环结构在编程中广泛使 ...
- Java中组合 设计技巧 实例
关于组合 和 集成 先放两篇文章:这两篇文章写的太好了. http://blog.csdn.net/u013905744/article/details/51752044 Java的组合(持有对 ...
- js 对于jquery each 多层循环的问题和原生js多层循环问题
一.在jquery中,我们使用循环的时候,提供两种方式:jquery.each 和(循环体).each 两种方式不是同. 对于return 在作用这两个的函数的时候需要注意: 首先我们需要知道我们的 ...
- sql中多层循环示例(有游标)
在需求处理中,我们会遇到需要通过SQL多层循环来处理的问题.如:A表中有8条数据,B表中有10条数据,需要实现A表中的每1条数据对应B表中的10条数据,最后就有了80条数据,从而实现一对多的关系.那如 ...
随机推荐
- 20155321 《网络攻防》 Exp7 网络欺诈防范
20155321 <网络攻防> Exp7 网络欺诈防范 实验内容 简单应用SET工具建立冒名网站 因为钓鱼网站是在本机的http服务下使用,因此需要将SET工具的访问端口改为http默认的 ...
- jsp页面中日期的格式化
在一次开发中,由于数据库中生日采用的是datetime的数据类型,因此数据库中数据格式为:2017-07-11 00:00:00. 但是,编辑页面中回显生日肯定是不可以显示出时分秒的, ...
- ElasticSearch入门 第三篇:索引
这是ElasticSearch 2.4 版本系列的第三篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
- ASP.NetCore2.0概览
微软为了统一微软平台,造就了.netStandard,不管之前的Framework还是最新的.netCore都必须支持.netStandard标准来统一各个平台的开发api. 以下是之前的微软各个 ...
- RabbitMQ使用注意
1.通常发布者发布结束后会释放Channel,但是消费者由于是异步监听,消费者的Channel不可以释放,否则就断开连接无法监听. 2.当使用默认配置时,ConnectionFactory不指定Por ...
- OAuth 2.0 Salesforce & Azure
最近在学习Salesforce,浅谈一下 OAuth 2.0 在Salesforce and Azure 之间的应用. 假设有这样一个场景,在Salesforce中需要用到Azure中的一些服务,那么 ...
- Ajax实例OR技术原理 转自 (http://blog.csdn.net/evankaka )
摘要:AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.AJAX 是一种用于创建快速动态网页的 ...
- Intellij IDEA 文件修改提示星号
https://www.cnblogs.com/zheting/p/7594073.html
- java第二次实验报告
课程:Java实验 班级:201352 姓名:池彬宁 学号:20135212 成绩: 指导教师:娄佳鹏 实验日期:15.05.05 实验密级: ...
- c# dataGridView 表头格式设置不管用
解决办法: EnableHeaderVisualStyles设为false