如何循环生成固定长度数组元素保留原位置其余替换为0的所有组合
数组组合需求最优实现方案
核心逻辑
这个需求本质是枚举数组每个位置的二选一状态:每个位置独立决定保留原始值还是替换为0,总共有2^15=32768种合法组合,使用位掩码法是最优实现,无多余计算,逻辑清晰易懂。
实现步骤
- 定义原始数组:
origin = [10, 10, 10, 50, 50, 100, 100, 100, 500, 500, 500, 1000, 1000, 1000, 5000] - 遍历0到2^15-1(即0到32767)的所有整数,每个整数作为位掩码,每一位对应数组一个位置的选择
- 对每个掩码逐位判断:第i位为1时,新数组第i位取原始值,否则取0
- 输出生成的新数组即可
代码示例(Python)
origin = [10, 10, 10, 50, 50, 100, 100, 100, 500, 500, 500, 1000, 1000, 1000, 5000] length = len(origin) # 遍历所有位掩码组合 for mask in range(1 << length): current = [] for idx in range(length): current.append(origin[idx] if (mask >> idx) & 1 else 0) print(current)
方案优势
- 无冗余计算:刚好遍历所有合法组合,没有递归开销或重复判断逻辑
- 达到理论最优时间复杂度O(n*2n),该问题本身需要生成n*2n个元素,没有进一步优化空间
- 适配性强:任意长度的原始数组都可以直接套用该逻辑,不需要修改核心代码
内容的提问来源于stack exchange,提问作者Philipp2706
相关产品推荐
相关产品推荐

