原理比较简单,m数组中的每个数要么出现,要么不出现,只要满足n个数出现就可以了
算法步骤:
- 先生成一个和m数组一样长度的临时数组temp(数组中除了0,就是1),temp中值为1的表示m该在位置的数字出现,0则表示不出现。初始化temp,前n位为1,其他全为0。
- 每次从左往右遍历数组temp,遇到第一个10,就将其变成01,再将变化位置左边所有1移动到数组的最左边。输出(保存)当前数组temp,temp按照步骤1对应的位置为1的数组则为结果。
- 继续循环步骤2,一旦遇到temp为右边N位全为1时,结束循环。
构造一个对象用来生成所有的组合(对象中的getFlagArray方法):
function findFlagArrays (opt) {
let self = this
let flag = {
arr: opt.arr,
n: opt.n,
getFlagArray: function () {
if(self.arr.length < self.n){
console.log('寻找长度大于数组长度')
return []
}
if(self.n < 1){
return []
}
let len = this.arr.length
let temp = []
let jixu = true
// 先给我们的数组初始化,前边n位为1,后边为0
for (let i = 0; i < len; i++) {
if (i < this.n) {
temp.push(1)
} else {
temp.push(0)
}
}
this.printf(temp)
while (jixu) {
let x = 0
let y = 0
let z = 0
for (let i = 0; i < len - 1; i++) {
if (temp[i] === 1 && temp[i + 1] === 0) {
x = i
temp[i] = 0
temp[i + 1] = 1
break
}
}
for (let i = 0; i < x; i++) {
if (temp[i] === 1) {
y++
}
}
for (let i = 0; i < x; i++) {
if (i < y) {
temp[i] = 1
} else {
temp[i] = 0
}
}
this.printf(temp)
// console.log(temp.join(' '))
for (let i = 0; i < len; i++) {
if (i < len - this.n && temp[i] === 0) {
z++
}
if (i >= len - this.n && temp[i] === 1) {
z++
}
}
if (z === len) {
jixu = false
}
}
},
printf: function (temp) {
let result = []
for (let i = 0; i < this.arr.length; i++) {
if (temp[i] === 1) {
result.push(this.arr[i])
}
}
console.log(result.join(' ') + ' + ' + temp.join(' '))
}
}
return flag
}
调用实例:
function findZuhe () {
let opt = {
arr: [1, 2, 3, 4, 5, 6, 7],
n: 4
}
let getFlag = this.findFlagArrays(opt)
getFlag.getFlagArray()
},
版权声明:本文为u014045565原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。