求出集合中指定元素个数的所有子集,求解决,想了好久没写出,数学不好

浪漫小和 2018-12-23 08:09:28
比如说集合里有 1 2 3 4 5,想找出所有3个元素的组成的集合,类似于 123 124 125,134 135 234 等等这样的子集
谢谢不胜感激
...全文
425 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_44059461 2018-12-24
  • 打赏
  • 举报
回复
引用 2 楼 龙遥 的回复:
这有何难

/**
* @author stevenlii
*/
public class GetSet {
private String[] origin = {"1", "2", "3", "4", "5"};

private String[] targetArray;

public static void main(String[] args) {
new GetSet().doJob();
}

private void doJob() {
//获取将要分解的字符串如果转为2进制最大是几
//如字符串是3位,就是2^3。从[0 0 0]到[1 1 1]
int maxLength = (int) Math.pow(2, origin.length);
targetArray = new String[maxLength];

for (int i = 0; i < targetArray.length; i++) {
//十进制转2进制
targetArray[i] = Integer.toBinaryString(i);
}

buling();

print(0);
}

/**
* 给空位补0,凑齐位数
*/
private void buling() {
for (int i = 0; i < targetArray.length; i++) {
//位数是完整的,不需要补0
if (targetArray[i].length() == origin.length) {
continue;
}
String temp = "";
//0,1,10,11,111
for (int j = 0; j < origin.length - targetArray[i].length(); j++) {
temp += "0";
}
targetArray[i] = temp + targetArray[i];
}
}

/**
* 打印子集,len == 0,打印所有子集,len>0,打印指定长度子集
* @param len
*/
private void print(int len){
for (int i = 0; i < targetArray.length; i++) {
String s = targetArray[i];//如000,001,010
StringBuilder subset = new StringBuilder();
for (int j = 0; j < s.length(); j++) {
char item = s.charAt(j);
if (item == '1') {
subset.append(origin[j]);
}
}

if (0 == len ||subset.toString().length() == len) {
System.out.println(subset.toString());
}
}
}
}


不太明白为什么要转换2进制的
不止鱼 2018-12-24
  • 打赏
  • 举报
回复
上面print 可以传参,传0则打印所有,传3则打印3位数的
不止鱼 2018-12-24
  • 打赏
  • 举报
回复
这有何难

/**
 * @author stevenlii
 */
public class GetSet {
    private String[] origin = {"1", "2", "3", "4", "5"};
 
    private String[] targetArray;
 
    public static void main(String[] args) {
          new GetSet().doJob();
    }
    
    private void doJob() {
        //获取将要分解的字符串如果转为2进制最大是几
        //如字符串是3位,就是2^3。从[0 0 0]到[1 1 1]
        int maxLength = (int) Math.pow(2, origin.length);
        targetArray = new String[maxLength];
 
        for (int i = 0; i < targetArray.length; i++) {
            //十进制转2进制
            targetArray[i] = Integer.toBinaryString(i);
        }
 
        buling();
        
        print(0);
    }
 
    /**
     * 给空位补0,凑齐位数
     */
    private void buling() {
        for (int i = 0; i < targetArray.length; i++) {
            //位数是完整的,不需要补0
            if (targetArray[i].length() == origin.length) {
                continue;
            }
            String temp = "";
            //0,1,10,11,111
            for (int j = 0; j < origin.length - targetArray[i].length(); j++) {
                temp += "0";
            }
            targetArray[i] = temp + targetArray[i];
        }
    }
 
    /**
     * 打印子集,len == 0,打印所有子集,len>0,打印指定长度子集
     * @param len
     */
    private void print(int len){
        for (int i = 0; i < targetArray.length; i++) {
            String s = targetArray[i];//如000,001,010
            StringBuilder subset = new StringBuilder();
            for (int j = 0; j < s.length(); j++) {
                char item = s.charAt(j);
                if (item == '1') {
                	subset.append(origin[j]);
                }
            }
            
            if (0 == len ||subset.toString().length() == len) {
            	System.out.println(subset.toString());
			}
        }
    }
}
qq_39936465 2018-12-24
  • 打赏
  • 举报
回复

import java.util.Scanner;

public class test10 {
static int[] s = { 1, 2, 3, 4, 5 };
static int[] t ;

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.print("请输入子集的元素个数:");
int c=sc.nextInt();
t=new int[c];
sub(c, 5);
}

static void sub(int x, int y) {
int a, b;
if (x == 0) {
for (int i:t) {
System.out.print(i);
}
System.out.println("");
}
for (int i = y; i > 0; i--) {
if (x > 0) {
t[x - 1] = s[i-1];
a = x - 1;
b = i - 1;
sub(a, b);
}else break;
}
}

}
不止鱼 2018-12-24
  • 打赏
  • 举报
回复
引用 4 楼 weixin_44059461 的回复:
[quote=引用 2 楼 龙遥 的回复:] 这有何难

/**
 * @author stevenlii
 */
public class GetSet {
    private String[] origin = {"1", "2", "3", "4", "5"};
 
    private String[] targetArray;
 
    public static void main(String[] args) {
          new GetSet().doJob();
    }
    
    private void doJob() {
        //获取将要分解的字符串如果转为2进制最大是几
        //如字符串是3位,就是2^3。从[0 0 0]到[1 1 1]
        int maxLength = (int) Math.pow(2, origin.length);
        targetArray = new String[maxLength];
 
        for (int i = 0; i < targetArray.length; i++) {
            //十进制转2进制
            targetArray[i] = Integer.toBinaryString(i);
        }
 
        buling();
        
        print(0);
    }
 
    /**
     * 给空位补0,凑齐位数
     */
    private void buling() {
        for (int i = 0; i < targetArray.length; i++) {
            //位数是完整的,不需要补0
            if (targetArray[i].length() == origin.length) {
                continue;
            }
            String temp = "";
            //0,1,10,11,111
            for (int j = 0; j < origin.length - targetArray[i].length(); j++) {
                temp += "0";
            }
            targetArray[i] = temp + targetArray[i];
        }
    }
 
    /**
     * 打印子集,len == 0,打印所有子集,len>0,打印指定长度子集
     * @param len
     */
    private void print(int len){
        for (int i = 0; i < targetArray.length; i++) {
            String s = targetArray[i];//如000,001,010
            StringBuilder subset = new StringBuilder();
            for (int j = 0; j < s.length(); j++) {
                char item = s.charAt(j);
                if (item == '1') {
                	subset.append(origin[j]);
                }
            }
            
            if (0 == len ||subset.toString().length() == len) {
            	System.out.println(subset.toString());
			}
        }
    }
}
不太明白为什么要转换2进制的[/quote] 很容易理解啊,二进制的占位表示,正好代表了子集的位置 比如 1,2,3,他的所有子集是3 2 23 1 13 12 123 那么你想,1,2,3是三位数,2的三次方是8,8的二进制占位是[0 0 0]到[1 1 1] 所以,比如子集3,就是[0 0 1],比如子集23就是[01 1],比如123就是[1 1 1],也就是从[0 0 0]到[1 1 1]的范围内, 按照1表示有,0表示无的方式映射,所有的子集都找到了。 然后按照1,2,3的顺序,对比二进制(从[0 0 0]到[1 1 1])的顺序,打印就可以了啊
浪漫小和 2018-12-23
  • 打赏
  • 举报
回复
个数是可以自己指定的最好。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧