java list 子集_一个List的全部子集

假设有一个list [1,2,3],要求出list的全部子集!

假设一个list的长度为n,那么它就包含

a227e9b587f84747aa1f5c4d.html 个子集(包含空集)。一样的,1个长度为 n 的二进制字符串,能够表示

a227e9b587f84747aa1f5c4d.html 个数。java

因此咱们不难联想到,要求list的子集,其实就是位运算:code

[ ]     ——> 0 0 0   ——> 0字符串

[1]     ——> 1 0 0   ——> 4class

[2]     ——> 0 1 0   ——> 2List

[3]     ——> 0 0 1   ——> 1遍历

[1,2]   ——> 1 1 0   ——> 6二进制

[1,3]   ——> 1 0 1   ——> 5im

[2,3]   ——> 0 1 1   ——> 3img

[1,2,3] ——> 1 1 1   ——> 7集合

因此要获得长度为 n 的list的子集,只须要遍历从 0—

a227e9b587f84747aa1f5c4d.html-1 ,而后转化成二进制,把对应位置为 1 的数字放入集合。

十进制转二进制:

由于我使用的是Java,在Java中有现成的语句可以调用:

int a = 8

b = Integer.toBinaryString(a);

输出:b = "1000"

固然也能够按照二进制的定义本身写:

public int toBinary(int num) {

int r = 0;

int k = 1;

int sum = 0;

while(num != 0) {

r = num % 2;

sum += r*k;

k *= 10;

num /= 2;

}

return sum;

}

完整代码(Java):

public List> subsets(int[] nums) {

List> sets = new ArrayList>();

for(int i=0;i<=Math.pow(2, nums.length)-1;i++) {

List list = new ArrayList();

String a = Integer.toBinaryString(i); //转化为二进制

for(int j=0;j

char c = a.charAt(j); //取到String中的每一个字符

if(c == '1') list.add(nums[nums.length-a.length()+j]); //把对应位置为1的数字放入集合

}

sets.add(list);

}

return sets;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值