廢話不多說直接上**,還有其他方法那些比較好理解。今天只說一下二進位制位運算的方法。
0 --> 0000
1 [1] --> 0001
2 [2] --> 0010
3 [1, 2] --> 0011
4 [3] --> 0100
5 [1, 3] --> 0101
6 [2, 3] --> 0110
7 [1, 2, 3] --> 0111
8 [4] --> 1000
9 [1, 4] --> 1001
10 [2, 4] --> 1010
11 [1, 2, 4] --> 1011
12 [3, 4] --> 1100
13 [1, 3, 4] --> 1101
14 [2, 3, 4] --> 1110
15 [1, 2, 3, 4] --> 1111
經過上面的轉換發現,二進位制和集合可以完美的對映。
接下來說**
for i in range(2 ** n): 2**n為子集個數。所以每迴圈一次為乙個子集
for j in range(n): 集合的長度進行迴圈,為了對二進位制對映進行位移判斷
if (i >> j) % 2:
[2, 3, 4] -> 1110 --> 14 用這個子集舉例
在不知道子集為[1,2,3]的前提下我們只知道這是第十四個迴圈也就是第十四個子集。
將14轉換成二進位制後為 1110 然後對其進行位運算 。
我們將二進位制當前位數值為1的對應集合位置的值存入當前子集
for j in range(n)
迴圈第一次的時候j為0也就是說if (i >> j) % 2: i也就是1110 位移0位 模 2 結果為0 所以集合中下標為j的位置資料不屬於該子集
同理第二次迴圈 位移一位得到值為111 模 2 結果為1 所以集合中下標為j的位置資料屬於該子集
第三第四次迴圈同理最後得該子集為[2, 3, 4]
集合中所有子集元素之和
題目 給乙個集合array,包含n個數。規定集合的 值 為集合中所有元素的和。求該集合的所有子集的值的和。示例 陣列 1,2 它的子集有空集,1 2 1,2 子集各自的值為0,1,2,3 所以子集值的和為0 1 2 3 6 解法一 思路 簡單暴力的方法就是窮舉陣列所有的子集,然後逐個求子集的值,然後...
子集合問題,排列出所有子集組合
想了好幾天,網上也沒有給出具體方法,索性就自己寫了乙個,但是效率不是很高,可以根據需求進行優化 public static void subset int arr,int target,list alllist else 遞迴結果集 public static void recursion int ...
集合a 列出它所有的不顛倒順序的子集合
code 需求是 就是不能顛倒順序 如出現 a集合 因為不能顛倒順序,那麼就按照原來的順序 只是顯示與不顯示的問題 1 顯示 0 不顯示 private static void sort2 char b else if cursor i cursor arr pos count 20 cursor ...