C# 数组中3个值的组合
我想生成一个数组,其中所有数组的位置组合中都有三个1,而所有其他位置都有0 在本例中,这些将是:C# 数组中3个值的组合,c#,arrays,boolean,C#,Arrays,Boolean,我想生成一个数组,其中所有数组的位置组合中都有三个1,而所有其他位置都有0 在本例中,这些将是: var example = new[]{1, 1, 1, 0, 1, 1} 我试图写的代码变得非常冗长和混乱,显然有更好的方法 我尝试使用位于原始阵列位置上方的“计数器”,并像这样移动: 1 1 1 0 0 0 1 1 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 0 1 0 1 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1
var example = new[]{1, 1, 1, 0, 1, 1}
我试图写的代码变得非常冗长和混乱,显然有更好的方法
我尝试使用位于原始阵列位置上方的“计数器”,并像这样移动:
1 1 1 0 0 0
1 1 0 0 1 0
1 1 0 0 0 1
1 0 1 0 1 0
1 0 1 0 0 1
1 0 0 0 1 1
0 1 1 0 1 0
0 1 1 0 0 1
0 1 0 0 1 1
0 0 1 0 1 1
等等。如果数组相对较短(应该是这样以避免内存溢出),您可以使用二进制计数来构建您正在寻找的算法:
- 假设原始数组有
N个
元素
- 将数组转换为
,将每个位置视为二进制数字;称之为int
set
- 制作一个从0到
(1)你想让别人为你写吗?还是你有一个具体的问题?我猜递归应该有一个非常基本的方法来实现这一点。你通常在数组中只有6个元素吗?通常数组中会有更多的元素,数组会非常稀疏,大部分是0和一些1。@alan2这里请参见
以上。CountBits
1 1 1 0 1 1 c c c c c c c c c c c c
static uint FromArray(int[] data) { uint res = 0; for (int i = 0 ; i != data.Length ; i++) { if (data[i] == 1) { res |= (1U << i); } } return res; } static int[] ToArray(uint set, int size) { var res = new int[size]; for (int i = 0 ; i != size ; i++) { if ((set & (1U << i)) != 0) { res[i] = 1; } } return res; } static int CountBits(uint set) { int res = 0; while (set != 0) { if ((set & 1) != 0) { res++; } set >>= 1; } return res; } public static void Main() { var example = new[]{1, 1, 1, 0, 1, 1}; var set = FromArray(example); int N = example.Length; var res = new List<uint>(); for (uint mask = 0 ; mask != 1U<<N ; mask++) { var candidate = set & mask; if (CountBits(candidate) == 3) { res.Add(candidate); } } foreach (var s in res.Distinct()) { var array = ToArray(s, N); Console.WriteLine(string.Join(" ", array.Select(i => i.ToString()).ToArray())); } }
1 1 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 1 0 0 0 1 1 0 1 0 0 1 0 1 1 0 0 1 1 0 0 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1