求一个数组的全部子集的两种解法
2016-08-08 19:22
246 查看
一个常见的情景是罗列出[1,2,5,8]的全部子集,结果如下[],[1],[2],[5],[8],[1,2].................
结果有很多,这中解法的题型非常的多,
那么第一种解法就是利用递归,压栈处栈
基本思想就是,1,2,5,83为一组
12 15 18 25 28为一组
125 128 258为一组
1258为一组
也就是说固定前面的数字 依次切换
代码如下:
public class CCCC {
private static List<Integer> stack1=new ArrayList<Integer>();
private static int[] savenumber=null;
private static List<String> jieguo=new ArrayList<String>();
public static void di(int index, int ce ,int start)
{
for(int i=start;i<savenumber.length;i++)
{
stack1.add(i);
if(ce==index)
{
yan();
}else{
di(index,ce+1, i+1);
}
stack1.remove(stack1.size()-1);
}
}
public static boolean yan() {
String he="";
for(int i=stack1.size()-1;i>=0;i--)
{
he+=savenumber[stack1.get(i)]+",";
}
jieguo.add(he);
return true;
}
public static int getSum(int[] xx){
int sum=0;
for(int i=0;i<xx.length;i++){
sum+=xx[i];
}
return sum;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
while(scanner.hasNextInt()){
Integer num= scanner.nextInt();
savenumber=new int[num];
for(int i=0;i<num;i++)
{
savenumber[i]=scanner.nextInt();
}
for(int ceng=1;ceng<=num;ceng++)
{
di(ceng,1,0);
}
System.out.println(jieguo.toString());
}
}
第二种算法,利用二进制的思想 如 0110 1001 0001
加入数组为[1,2,5,8] 0110 就代表[ 2,5] 1001 代表[ 1,8] 0表示该数组位置不选,1表示选中
代码如下
zpublic class SSSS {
static int n;
static List<String> list=new ArrayList<String>();
public static void get(int x,int[] mm){
String sum="";
String m=getBinaryValue(x);
char[] data=m.toCharArray();
for (int i = 0; i < data.length; i++) {
if(data[i]=='1'){
sum+=mm[i];
}
}
if(!sum.equals(""))
list.add(sum);
}
public static String getBinaryValue(int x)
{
StringBuffer sb = new StringBuffer(Integer.toBinaryString(x));
int length = sb.length();
for(int j=0;j<n-length;j++){
sb.insert(0, "0");
}
return sb.toString();
}
public static int getSum(int[] xx){
int sum=0;
for(int i=0;i<xx.length;i++){
sum+=xx[i];
}
return sum;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNextInt()){
int[] mm;
n=in.nextInt() ;//注意while处理多个case
mm=new int
;
for(int i=0;i<n;i++){
mm[i]=in.nextInt() ;
}
for (int i = 0; i < Math.pow(2, n)-1; i++) {
get(i, mm);
}
System.out.println(list.toString());
}
}
当我们得到所以集合时,问题将迎刃而解,
不仅仅数组可以这么做,字符串也可以,当我们学习一种算法,要掌握它的思想,做到举一反三
结果有很多,这中解法的题型非常的多,
那么第一种解法就是利用递归,压栈处栈
基本思想就是,1,2,5,83为一组
12 15 18 25 28为一组
125 128 258为一组
1258为一组
也就是说固定前面的数字 依次切换
代码如下:
public class CCCC {
private static List<Integer> stack1=new ArrayList<Integer>();
private static int[] savenumber=null;
private static List<String> jieguo=new ArrayList<String>();
public static void di(int index, int ce ,int start)
{
for(int i=start;i<savenumber.length;i++)
{
stack1.add(i);
if(ce==index)
{
yan();
}else{
di(index,ce+1, i+1);
}
stack1.remove(stack1.size()-1);
}
}
public static boolean yan() {
String he="";
for(int i=stack1.size()-1;i>=0;i--)
{
he+=savenumber[stack1.get(i)]+",";
}
jieguo.add(he);
return true;
}
public static int getSum(int[] xx){
int sum=0;
for(int i=0;i<xx.length;i++){
sum+=xx[i];
}
return sum;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
while(scanner.hasNextInt()){
Integer num= scanner.nextInt();
savenumber=new int[num];
for(int i=0;i<num;i++)
{
savenumber[i]=scanner.nextInt();
}
for(int ceng=1;ceng<=num;ceng++)
{
di(ceng,1,0);
}
System.out.println(jieguo.toString());
}
}
第二种算法,利用二进制的思想 如 0110 1001 0001
加入数组为[1,2,5,8] 0110 就代表[ 2,5] 1001 代表[ 1,8] 0表示该数组位置不选,1表示选中
代码如下
zpublic class SSSS {
static int n;
static List<String> list=new ArrayList<String>();
public static void get(int x,int[] mm){
String sum="";
String m=getBinaryValue(x);
char[] data=m.toCharArray();
for (int i = 0; i < data.length; i++) {
if(data[i]=='1'){
sum+=mm[i];
}
}
if(!sum.equals(""))
list.add(sum);
}
public static String getBinaryValue(int x)
{
StringBuffer sb = new StringBuffer(Integer.toBinaryString(x));
int length = sb.length();
for(int j=0;j<n-length;j++){
sb.insert(0, "0");
}
return sb.toString();
}
public static int getSum(int[] xx){
int sum=0;
for(int i=0;i<xx.length;i++){
sum+=xx[i];
}
return sum;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNextInt()){
int[] mm;
n=in.nextInt() ;//注意while处理多个case
mm=new int
;
for(int i=0;i<n;i++){
mm[i]=in.nextInt() ;
}
for (int i = 0; i < Math.pow(2, n)-1; i++) {
get(i, mm);
}
System.out.println(list.toString());
}
}
当我们得到所以集合时,问题将迎刃而解,
不仅仅数组可以这么做,字符串也可以,当我们学习一种算法,要掌握它的思想,做到举一反三
相关文章推荐
- 【数字题2】求一个数组的全部子集
- 给定一个集合(字符数组),打印出它的所有子集
- 求一个串中出现的第一个最长可重叠重复子串 [后缀数组解法]
- 用 公平的算法 把一个数组打乱(两种实现方式)
- 数组代码php判断一个数组是另一个数组的子集
- php判断一个数组是另一个数组的子集
- 数组求和的一个解法
- 将一个数组中的奇元素全部移到数组的前半部分,即将奇偶元素分开
- 怎么将ListBox中的数据全部存入一个数组中
- 输出一个一维数组中的最大值、最小值、全部元素的和,并将此数组中的值按逆序重新存放
- 将一个数组中的奇元素全部移到数组的前半部分,即将奇偶元素分开
- HDU 1556 Color the ball 很典型的更新区间查找点的题(线段树树状数组两种解法)
- 组合C(N,M)【一个思路,两种解法】
- 一个C++面试题的数组和STL解法
- 用 公平的算法 把一个数组打乱(两种实现方式)
- 把一个数组里的数组合全部列出,比如1 2 列出来为1,2,12,21
- 数组中超过出现次数超过一半的数字 的一个解法
- 输出一个集合的全部子集
- Map接口及其重要实现类的方法总结:从HashMap中放入,查找,删除一个对象,并将全部value放入到一个数组中;获得HashMap的全部数据
- 将一个数组中的奇元素全部移到数组的前半部分,即将奇偶元素分开