C#实现按各产品最大值生成全部组合的技术需求与问题
解决方案
我们需要实现一个支持每个位置自定义最大值的组合生成函数,核心思路是将组合编号按「可变进制」分解为对应位置的数字,具体实现如下:
实现逻辑
- 把输入的字符串最大值列表转为整数数组,明确每个位置的取值范围(从
0到对应最大值)。 - 计算总组合数:每个位置的可能取值数量(
最大值 + 1)的乘积。 - 预计算每个位置的「权重」(后续所有位置的取值数量乘积),用于快速分解组合编号。
- 遍历每个组合编号,通过权重分解出每个位置的数字,拼接成目标字符串。
代码实现
private List<string> GetCustomCombinationSet(List<string> maxEachProduit) { // 将字符串最大值转为整数数组 int[] maxValues = maxEachProduit.Select(s => int.Parse(s)).ToArray(); List<string> combinations = new List<string>(); // 计算总组合数 int totalCombinations = 1; foreach (int max in maxValues) { totalCombinations *= (max + 1); } // 预计算每个位置的权重(后续位置取值数的乘积) int[] weights = new int[maxValues.Length]; weights[^1] = 1; // 最后一位权重固定为1 for (int i = weights.Length - 2; i >= 0; i--) { weights[i] = weights[i + 1] * (maxValues[i + 1] + 1); } // 生成所有组合 for (int i = 0; i < totalCombinations; i++) { int remaining = i; StringBuilder sb = new StringBuilder(); foreach (int weight in weights) { int digit = remaining / weight; sb.Append(digit); remaining %= weight; } combinations.Add(sb.ToString()); } return combinations; }
使用示例
示例1:输入{"2", "3"}
调用函数后将生成:"00", "01", "02", "03", "10", "11", "12", "13", "20", "21", "22", "23"
示例2:输入{"2", "1", "1"}
调用函数后将生成从"000"到"211"的全部12种组合。
注意事项
- 确保输入的字符串都能转换为非负整数,否则
int.Parse会抛出异常,可按需添加异常捕获逻辑。 - 若总组合数超出
int范围(比如多组大最大值的情况),可改用long类型计算总数量和遍历编号。
内容的提问来源于stack exchange,提问作者SkiBoxing
相关产品推荐
相关产品推荐

