我在星期五的大部分时间都在尝试解决这个问题:
从整数集合中生成唯一的无序集列表。
[如果一个元素在原始集合中重复,则出于构建集合的目的将其视为两个单独的元素]
我最终到达了以下,它达到了正确的结果。我想知道是否有更有效的方法。
特别是,我的 Shift() 方法必须以更有效的形式存在于某个地方。我对按位运算不是很熟悉......但也许它们适用于这里?
List<int[]> Unique(List<int> intList)
{
List<int[]> results = new List<int[]>();
bool[] toAdd = new bool[intList.Count];
toAdd[toAdd.Length - 1] = true;
int totalSets = (int)Math.Pow(2, intList.Count) - 1;
List<int[]> sets = new List<int[]>();
for (int i = 0; i < totalSets; i++)
{
int[] set = new int[toAdd.Count(p => p)];
int c = 0;
for (int j = toAdd.Length - 1; j >= 0; j--)
if (toAdd[j])
set[c++] = intList[j];
Shift(toAdd);
results.Add(set);
}
return results;
}
void Shift(bool[] array)
{
bool doShift = true;
for (int i = array.Length - 1; i >= 0; i--)
{
if (doShift)
array[i] = !array[i];
doShift = (doShift && !array[i]);
}
}