erbing/logic-training

实现0和1的排列组合

erbing opened this issue · 7 comments

要求:给定一个组合长度,输出由0和1在该长度内排列组合形成的二维数组。
例如:

function getArr( size ){
    //TODO - 完成该方法
}

var arr = getArr(4);  //给定组合长度为4
console.log( JSON.stringify(arr) );
/** 打印出:
[[0,0,0,0],[0,0,0,1],[0,0,1,0],[0,0,1,1],[0,1,0,0],[0,1,0,1],[0,1,1,0],[0,1,1,1],
[1,0,0,0],[1,0,0,1],[1,0,1,0],[1,0,1,1],[1,1,0,0],[1,1,0,1],[1,1,1,0],[1,1,1,1]]
****/
/**
 * @param {最终的二维数组} arrAll
 * @param {给定的长度} size
 * @param {当前的一维数组} [arrOne=[]]
 */
function calcArray(arrAll, size, arrOne = []) {
    for (let index = 0; index < 2; index++) {
        // 非常重要,将上一步的计算结果拷贝一份,作为下一次计算的起点
        let arrOneCopy = [...arrOne];

        // 将当前项,存入数组
        arrOneCopy.push(index);

        // 判断是否到达给定长度
        if (arrOneCopy.length >= size) {
            // 结束当前递归
            arrAll.push(arrOneCopy);
        } else {
            // 继续递归
            calcArray(arrAll, size, arrOneCopy);
        }
    }
}

function getArr(size) {
    let arrAll = [];
    calcArray(arrAll, size);
    return arrAll;
}

var arr = getArr(4); //给定组合长度为4

console.log(arr.length, JSON.stringify(arr));
function gen (count) {
  var ret = []
  var acc = []

  genCore(0, count, false, acc.slice())
  genCore(0, count, true, acc.slice())

  function genCore (index, count, toOne, xs) {
    if (index <= count - 1) {
      xs[index] = toOne ? 1 : 0
    }
    if (index === count - 1) {
      ret.push(xs)
      return
    }
    genCore(index + 1, count, false, xs.slice())
    genCore(index + 1, count, true, xs.slice())
  }

  return ret
}

看看这个爽不爽

alasq commented
//这个写法主要想尝试使用一些js的新特性
console.time('size100')
function* items(len){
    var i=0;
    while (i<2**len) {
        yield (i++).toString(2)
    }
}
function getArr(len){
  return  [...items(len)].map(item=>(Array(len+1).join(0)+item).slice(-len))
}
console.log( JSON.stringify(getArr(100)) );
console.timeEnd('size100')
alasq commented

打印100个内存就溢出了,想了想2的100次方蛮大的,不知道数组最大支持多少的长度

console.time('start')
function* items(len){
    var i=0;
    while (i<2**len) {
        var v=(i++).toString(2)
        yield getArrgen(v,len)
    }
}
function getArrgen(v,len){
    return function* (){
        var i=0
        while(i<len){
            if(i<len-v.length){
                yield 0
            }else{
                yield +v[v.length+i-len]
            }
            i++
        }
        
    }
}
for (const item of items(32)) {
    console.log([...item()])
}

console.timeEnd('start')

目前看到的 最简短的答案

var res=[]
for(var i=0;i<size*size;i++){
var item=i.toString(2).split("").map(function(item){return parseInt(item)})
while(item.length<size){item.unshift(0)}
res.push(item)
}

目前看到的 最简短的答案

var res=[]
for(var i=0;i<size*size;i++){
var item=i.toString(2).split("").map(function(item){return parseInt(item)})
while(item.length<size){item.unshift(0)}
res.push(item)
}

有bug 啊...

const getArr = ( size ) => {
    let resArr = []
    for (let i = 0; i < size ** 2; i++) {
        let e = i.toString(2)
        if(e.length < 4) e = Array(size - e.length + 1).join(0) + e 
        let eArr = e.split('').map(item => Number(item))
        resArr.push([eArr])
    }
    return resArr
}

let arr = getArr(4);        //    给定组合长度为4
console.log( arr );