原理比较简单,m数组中的每个数要么出现,要么不出现,只要满足n个数出现就可以了
算法步骤:
1、先生成一个和m数组一样长度的临时数组flagArr(数组中除了0,就是1),flagArr中值为1的表示m该在位置的数字出现,0则表示不出现。初始化flagArr,前n位为1,其他全为0。
2、每次从左往右遍历数组flagArr,遇到第一个10,就将其变成01,再将变化位置左边所有1移动到数组的最左边。输出(保存)当前数组flagArr为结果。
3、继续循环步骤2,一旦遇到flagArr为右边n位全为1时,结束循环。
下边是代码实现:
function getFlagArrs () {
let m = 5
let n = 3
if (!n || n < 1) {
return []
}
let resultArrs = []
let flagArr = []
let isEnd = false
let i, j, leftCnt
for (i = 0; i < m; i++) {
flagArr[i] = i < n ? 1 : 0
}
resultArrs.push(flagArr.concat())
while (!isEnd) {
leftCnt = 0
for (i = 0; i < m - 1; i++) {
if (flagArr[i] === 1 && flagArr[i + 1] === 0) {
for (j = 0; j < i; j++) {
flagArr[j] = j < leftCnt ? 1 : 0
}
flagArr[i] = 0
flagArr[i + 1] = 1
var aTmp = flagArr.concat()
resultArrs.push(aTmp)
if (aTmp.slice(-n).join('').indexOf('0') === -1) {
isEnd = true
}
break
}
flagArr[i] === 1 && leftCnt++
}
}
console.log(resultArrs)
return resultArrs
}
}