面试或笔试中,多次遇到以下4个关于排列组合的手撕算法,这里做个笔记,方法日后查阅:

1. 无重复元素的数组,求全排列;

2. 有重复元素的数组,求全排列;

3. 无重复元素的数组,求组合【子集】;

4. 有重复元素的数组,求组合;

以上四类题,可以用统一的模板实现,如下所示:

/*

*【组合&&排列】

*把一个数组里的数组合全部列出,比如1和2列出来为1,2,12,21.

*这个题目可以扩展成四个:

*1.无重复数字的数组,求组合

*2.有重复数字的数组,求组合

*3.无重复数字的数组,求全排列

*4.有重复数字的数组,求全排列

*【通用思路(递归)】:

*定义一个函数:从候选集candicate中选取一个组合prefix

*每次从候选集candicate中remove一个数,并加入前缀prefix,打印prefix;

*再递归从新的candicate中remove下一个数,并加入prefix

*【对于重复的控制】

*采用hashset保存prefix,打印之前,判断hashset中是否包含当前生成的prefix,

*没有则打印,并加入hashset;有则不打印

*【组合--》排列】

*只需在打印前加一个判断:若候选集candicate为空,表示遍历完一次,生成一个排列,可打印

*/

package xh.offer.practice;

import java.util.Arrays;

import java.util.HashSet;

import java.util.LinkedList;

import java.util.List;

public class listAllGroup{

public static void main(String[] args) {

String [] array = {"1","2"};

String [] repeate = {"1","2","1"};

listAllGroup test = new listAllGroup();

System.out.println("**********no repeate list*******");

test.listAllNoRepeate(Arrays.asList(array),"");//初始化prefix = ""

System.out.println("**********repeate list*******");

HashSet noRepeateSet = new HashSet();

test.listAllRepeate(Arrays.asList(repeate), "", noRepeateSet);

System.out.println("**************no repeate premutation********************");

test.premutationNoRepeate(Arrays.asList(array),"");

System.out.println("*********************repeate premutation**********************");

HashSet repeateSet = new HashSet();

test.premutationRepeate(Arrays.asList(repeate),"", repeateSet);

}

//无重复的组合

public void listAllNoRepeate(List candicate,String prefix){

if(prefix.length() != 0)

System.out.println(prefix);//结果长度不为0,则打印输出该组合

for(int i = 0;i < candicate.size();i++){

//将list转换成linklist链表,方便操作

List tempList = new LinkedList(candicate);

//templist减少一个数字,并暂存templist中去除的数字

String tempString = (String) tempList.remove(i);

//递归

listAllNoRepeate(tempList,prefix + tempString);

}

}

//有重复的组合,加入hashset

public void listAllRepeate(List candicate,String prefix,HashSet res){

if(prefix.length() != 0 && !res.contains(prefix)){

System.out.println(prefix);

res.add(prefix);

}

for(int i = 0;i < candicate.size();i++){

List tempList = new LinkedList(candicate);

String tempString = tempList.remove(i);

listAllRepeate(tempList, prefix+tempString, res);//递归

}

}

//无重复的全排列,加入判断candicate.size() == 0

public void premutationNoRepeate(List candicate,String prefix){

if(candicate.size() == 0){

System.out.println(prefix);

}

for(int i = 0;i < candicate.size();i++){

List tempList = new LinkedList(candicate);

String tempString = tempList.remove(i);

premutationNoRepeate(tempList,prefix+tempString);

}

}

//有重复的全排列,加入hashset辅助判断输出

public void premutationRepeate(List candicate,String prefix,HashSet res) {

if(candicate.size() == 0 && !res.contains(prefix)){

System.out.println(prefix);

res.add(prefix);

}

for(int i = 0;i < candicate.size();i++){

List tempList = new LinkedList(candicate);

String tempString = tempList.remove(i);

premutationRepeate(tempList, prefix+tempString, res);

}

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持聚米学院。

java 数组的排列组合_java数组排列组合问题汇总相关推荐

  1. java 数组减除值_java数组操作 - osc_hwpd2zko的个人空间 - OSCHINA - 中文开源技术交流社区...

    什么是数组: 程序 = 算法+数据结构 算法:解决问题的步骤,流程(顺序,分支,循环) 数据结构:将数据按照某种特定的结构来保存 数怎么存 设计良好的,合理的数据结构可以导致好的算法 数组:就是一种最 ...

  2. java数组声明语句是_Java数组的声明和遍历

    Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java 语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如 n ...

  3. java数组中怎么去重_java数组去重怎么弄???大神来解

    [Java] 纯文本查看 复制代码public class TestDemo { public static void main(String[] args) { //10个整数{9,10,6,6,1 ...

  4. java数组使用实验报告_JAVA数组与类的定义-java实验报告

    JAVA数组与类的定义-java实验报告 JAVA数组与类的定义-java实验报告 .实验目的与要求 1. 熟悉Java类.对象和方法的一般操作练习等. 2. 熟悉数组等的定义和使用. 二.实验内容及 ...

  5. java数组元素是类_Java数组及其常用类

    本文由疯狂软件教育中心整理,更多Java等高新技术,疯狂软件期待与你交流. 一.JAVA中的数组 (1)数组的定义:是有相同类型的.用一个标识符名称封装到一起的一个对象序列或基本数据类型数据序列. 数 ...

  6. java 使用vsphere 创建虚拟机‘_Java数组的创建及使用

    数组是具有相同数据类型的一组数据的集合,作为对象允许使用new关键字进行内存分配.首先先来熟悉一下一维数组的创建和使用. 声明一维数组,有下列两种方式: 数组元素类型 数组名字[]; 数组元素类型[] ...

  7. java数组初始化的方式_java数组初始化方式

    在使用一个新的数组之前,要先对其中的数值进行设置,也就是我们常说的初始化工作.因为数组有长度和内容的区分,所以常见的两种初始化方法是动态和静态,另外一种就是默认初始化.下面我们对数组的初始化概念进行理 ...

  8. java 数组声明并初始化_Java数组的声明与初始化

    在<Java数组简介>一节中,我们已经了解了什么是数组.什么是基本数据类型的数组,那么大家是不是迫不及待地想知道一个基本数据类型的数组是什么样子的呢?下面我们就一起来揭开它神秘的面纱吧! ...

  9. java二维数组杨辉三角_java数组学习:使用二维数组输出杨辉三角

    import java.util.Scanner; /* 输出二维数组"杨辉三角" i\j0 1 2 3 4 5 01 11  1 21  2  1 31 3 3  1 41  4 ...

  10. java数组怎么全部初始化_Java数组初始化,这三种方式有什么区别?

    首先因为数组初始化要使用的时候必须确定数组的长度,也就是说数组的长度是不可变的. 在JAVA中创建数组有两种方式 : (1)静态创建 如 Object[] arr1 = {"a", ...

最新文章

  1. 全民K歌内容挖掘与召回
  2. 浅析 Linux 初始化 init 系统
  3. CentOS 6使用rpm方式安装JDK8
  4. java中集合的迭代操作
  5. 开源十问, 社区新人快速上手指南
  6. C#开发笔记之20-如何用C#深克隆一个对象(优雅方案)?
  7. 为所有北京奥运冠军名字作诗(诗集)
  8. python函数装饰器有什么作用请列举说明_你必须学写 Python 装饰器的五个理由
  9. WEB-ERROR-PAGE
  10. 如何用java编写五子棋_java编写五子棋
  11. 稳重大气教师说课PPT模板
  12. MyEclipse10破解 运行run.bat闪退
  13. 我的世界命令计算机,我的世界电脑版指令大全,你想要的指令都在这里
  14. linux终端文件名前特殊符号,Linux特殊符号大全
  15. js 多线程Worker
  16. 微信公众号【黄小斜】和【Java技术江湖】
  17. 贝叶斯推断应用:垃圾邮件过滤
  18. htts 及 tomcat ssl配置
  19. 软件测试面试-为什么选择软件测试?
  20. 蜻蜓FM信息流推荐探索与实践

热门文章

  1. python是一门面向过程的语言_python是面向对象还是面向过程?
  2. 卸载bcl easyconverter sdk 5 word的方法
  3. Oracle 10g里面的table conpression
  4. Zabbix server: Utilization of http poller processes over 75% 问题解决。
  5. GNSS/GPS 精度(RMS,CEP,Sigma) 与精度因子(DOP)
  6. Hack This Site Realistic 1
  7. 这世界很大,这世界也很小
  8. 蓝牙耳机啥牌子好?内行盘点目前最好用的蓝牙耳机
  9. 【有奖话题】一场因疫苗引发的技术风波?
  10. Guitar Pro中文版免费激活注册机码V2021.20.7下载地址问题疑难解答