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实现组合、排列、重复排列(多层循环)的更多相关文章

  1. Java的组合排列问题

    从4个人中选2个人参加活动,一共有6种选法. 从n个人中选m个人参加活动,一共有多少种选法?C(m/n)=C((m-1)/(n-1))+C(m/(n-1))数学算法 public class Main ...

  2. java的break跳出多层循环

    记得大一的时候,语言学的不好,碰到了需要跳出双层循环的时候,就没有了办法.因为老师讲了goto然后说不要用goto...  自己就一直感觉这种跳出多层循环的想法是不可取的(好蠢) 下面用java代码的 ...

  3. JAVA如何跳出多层循环

    1. break.continue.return 的区别: break默认是跳出最里层的循环,也就是break所在的最近的那层循环 continue是终止本次循环,继续下次循环 return 结束当前 ...

  4. Java语法基础(四)----循环结构语句

    一.循环结构: 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则 ...

  5. 关于python如何简单跳出多层循环

    上述代码的逻辑是,在跳出子循环之前定义一个变量flag为Ture,第一层循环跳出之后,如果要跳出第二个循环,直接调用变量flag,可以直接跳出第二层循环.这里要注意的是缩进,不然会出错误. 如果是多层 ...

  6. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

  7. 九天学会Java,第四天,循环结构

    变量和数据类型,赋值和输出 算术运算 选择结构 循环结构 函数定义,函数调用 变量作用域 栈,程序运行的基石 面向对象 异常处理 语言提供的公用包 这次我们讲Java的循环结构.循环结构在编程中广泛使 ...

  8. Java中组合 设计技巧 实例

    关于组合 和 集成 先放两篇文章:这两篇文章写的太好了. http://blog.csdn.net/u013905744/article/details/51752044    Java的组合(持有对 ...

  9. js 对于jquery each 多层循环的问题和原生js多层循环问题

    一.在jquery中,我们使用循环的时候,提供两种方式:jquery.each 和(循环体).each  两种方式不是同. 对于return 在作用这两个的函数的时候需要注意: 首先我们需要知道我们的 ...

  10. sql中多层循环示例(有游标)

    在需求处理中,我们会遇到需要通过SQL多层循环来处理的问题.如:A表中有8条数据,B表中有10条数据,需要实现A表中的每1条数据对应B表中的10条数据,最后就有了80条数据,从而实现一对多的关系.那如 ...

随机推荐

  1. 20155207 《网络对抗》exp4 恶意代码分析 学习总结

    20155207 <网络对抗> 恶意代码分析 学习总结 实践目标 1.是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2.是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件 ...

  2. vijos 1641 Vs Snowy

    代码: #include<set> #include<cstdio> #include<cstring> #include<iostream> #inc ...

  3. 4556: [Tjoi2016&Heoi2016]字符串

    4556: [Tjoi2016&Heoi2016]字符串 链接 分析: 首先可以二分这个长度.此时需要判断是否存在一个以b结尾的前缀,满足与[c,d]的lcp大于等于mid. 如果我们把串翻转 ...

  4. C语言学习之结构体

    前言 一直以来,C语言的学习都在入门阶段,只用到数组.函数.循环.选择.位运算这些基本的知识,较少用到指针.预处理.结构体.枚举类型.文件操作等这些C语言的精髓内容,现在想想真不敢说自己熟练掌握C语言 ...

  5. ElasticSearch查询 第一篇:搜索API

    <ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...

  6. 一个web应用的诞生(3)--美化一下

    经过上一章的内容,其实就页面层来说已结可以很轻松的实现功能了,但是很明显美观上还有很大的欠缺,现在有一些很好的前端css框架,如AmazeUI,腾讯的WeUI等等,这里推荐一个和flask集成很好的b ...

  7. centos7 部署mysql-5.7.20

    一.系统环境 系统:CentOS Linux release 7.5 mysqlb进制包:mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz 1)依赖包安装 yum ...

  8. Linux 僵尸进程

    Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态.例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止.如果子进 ...

  9. 机器学习中几种优化算法的比较(SGD、Momentum、RMSProp、Adam)

    有关各种优化算法的详细算法流程和公式可以参考[这篇blog],讲解比较清晰,这里说一下自己对他们之间关系的理解. BGD 与 SGD 首先,最简单的 BGD 以整个训练集的梯度和作为更新方向,缺点是速 ...

  10. metasploit学习之情报搜集

    3.1.被动信息搜集whois查询Netcraft nslookup>set type=mx>testfire.net Google Hacking 3.2 主动信息搜集 使用nmap进行 ...