oracle一组数所有组合的和,把一个数组里的数的组合全部列出

题目:

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

分析:

这道题有多种扩展,

1,没有重复元素的数的组合(包括子集的全排列);

2,有重复元素的数的组合;

3,没有重复元素的数的全排列;

4,有重复元素的数的全排列。

1,没有重复元素的数的组合

思路:将数组元素存在LinkedList里(方便删除),遍历List,删除当前元素并把此元素加入结果,如果结果长度不为0,则输出,以此递归。

CODE_ico.pngico_fork.svg

package javainterview;

import java.util.Arrays;

import java.util.LinkedList;

import java.util.List;

public class Q7_1_1_a {

public static void listAll(List candidate, String prefix){

if(prefix.length()!=0){

System.out.println(prefix);

}

for(int i=0; i

List temp = new LinkedList(candidate);

int item = (int)temp.remove(i);

listAll(temp, prefix+item);

}

}

public static void main(String[] args) {

Integer[] array = {1,2};

List list = Arrays.asList(array);

listAll(list, "");

}

}

2,有重复元素的数的组合

思路,因为有重复元素,按照1的做法,会出现重复的情况,这里的处理方法是把结果保存在一个HashSet里,每得到一个结果,检查HashSet里是否已经存在,不存在才输出。

CODE_ico.pngico_fork.svg

package javainterview;

import java.util.Arrays;

import java.util.HashSet;

import java.util.LinkedList;

import java.util.List;

public class Q7_1_1_b {

public static void listAll(List candidate, String prefix, HashSet hs){

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

System.out.println(prefix);

hs.add(prefix);

}

for(int i=0; i

List temp = new LinkedList(candidate);

int item = (int)temp.remove(i);

listAll(temp, prefix+item, hs);

}

}

public static void main(String[] args) {

Integer[] array = {1,1,2};

List list = Arrays.asList(array);

HashSet hs = new HashSet();

listAll(list, "", hs);

}

}

3,没有重复元素的全排列

思路,不同之处在于只要所有元素的全排列,不要子集了。那么,在输出时加多一个判断就可以了,就是list的size要等于0.

CODE_ico.pngico_fork.svg

package javainterview;

import java.util.Arrays;

import java.util.LinkedList;

import java.util.List;

public class Q7_1_1_c {

public static void listAll(List candidate, String prefix){

if(candidate.size()==0 && prefix.length()!=0){

System.out.println(prefix);

}

for(int i=0; i

List temp = new LinkedList(candidate);

int item = (int)temp.remove(i);

listAll(temp, prefix+item);

}

}

public static void main(String[] args) {

Integer[] array = {1,2};

List list = Arrays.asList(array);

listAll(list, "");

}

}

为方便起见,不管是字符串全排列还是数组全排列,全部转化为LinkedList来处理

CODE_ico.pngico_fork.svg

package javainterview;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.LinkedList;

import java.util.List;

public class Permutation {

public static List permutation(String s){

List res = new ArrayList();

if(s==null) return res;

List list = new LinkedList();

for(int i=0; i

list.add(s.charAt(i));

permutation(res, list, "");

return res;

}

public static void permutation(List res, List list, String prefix){

if(list.size()==0)

res.add(prefix);

for(int i=0; i

List temp = new LinkedList(list);

char item = (char)temp.remove(i);

permutation(res, temp, prefix+item);

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

String s = "";

List res = permutation(s);

for(String item : res)

System.out.println(item + ";");

}

}

4, 有重复元素的全排列

思路:也是用一个HashSet来存放结果。

CODE_ico.pngico_fork.svg

package javainterview;

import java.util.Arrays;

import java.util.HashSet;

import java.util.LinkedList;

import java.util.List;

public class Q7_1_1_d {

public static void listAll(List candidate, String prefix, HashSet hs){

if(candidate.size()==0 && prefix.length()!=0 && !hs.contains(prefix)){

System.out.println(prefix);

hs.add(prefix);

}

for(int i=0; i

List temp = new LinkedList(candidate);

int item = (int)temp.remove(i);

listAll(temp, prefix+item, hs);

}

}

public static void main(String[] args) {

Integer[] array = {1,1,2};

List list = Arrays.asList(array);

HashSet hs = new HashSet();

listAll(list, "", hs);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值