everycode icon indicating copy to clipboard operation
everycode copied to clipboard

2014年12月30日D5

Open businiaowa opened this issue 11 years ago • 5 comments

 /*
 *返回arr的所有长度为size的子数组的组合
 * 如arr = [1,2,3,4], size = 2
 * return [[1,2], [1,3], [1,4], [2,3], [2,4], [3,4]]
 *
 * 再如arr = [1,2,3,4], size = 3
 * return [[1,2,3], [1,2,4],[1,3,4] [2,3,4]];
 */
 function power( arr, size) {
    //TODO
 }

businiaowa avatar Dec 29 '14 08:12 businiaowa

 function power(arr, size) {
    var r = [];
    function _(t, a, n) {
        if (n === 0) {
            r[r.length] = t;
            return t;
        }
        for (var i = 0, l = a.length - n; i <= l; i++) {
            var b = t.slice();
            b.push(a[i]);
            _(b, a.slice(i + 1), n - 1);
        }
    }
    _([], arr, size);
    return r;
 }

 alert(power([1,2,3,4], 2).join('\n'));

liuyutong avatar Dec 29 '14 08:12 liuyutong

function power( arr, size ) {
    var first,
        subPower,
        i, len,
        ret = [];

    if( arr.length === size ) {
        return arr;
    }

    if( size === 1 ) {
        for( i = 0, len = arr.length; i < len; i++ ) {
            ret.push( [arr[i]] );
        }
        return ret;
    }

    while ( arr.length >= size ) {  
        if( arr.length === size ) {
            ret.push( arr );
            break;
        } else {
            first = arr.shift();
            subPower = power( arr.slice(0), size - 1 );
            for( i = 0, len = subPower.length; i < len; i++ ) {
                subPower[i].push(first);
                ret.push( subPower[i] );
            }
        }
    }   
    return ret;
}

上我的答案

businiaowa avatar Dec 29 '14 11:12 businiaowa

 function power(arr, size) {
    var results = [];

    // 每次截取一个值
    // 循环被截取的数组
    // 每次生成size要求的数组,并将被截取的值放到数组的开头,并保存到集合
    // 递归调用直到数组被清空为止
    (function (arr) {
        var current = arr.shift();
        for(var i = 0; i < arr.length; i++) {
            var result = arr.slice(i, i+(size-1));
            result.unshift(current);

            result.length === size && results.push(result);
        }

        if(arr.length) { arguments.callee(arr) }
    })(arr);

    return results;
 }


 // 测试用例
 console.log(power([1,2,3,4], 2)); // [ [ 1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 2, 3 ], [ 2, 4 ], [ 3, 4 ] ]
 console.log(power([1,2,3,4], 3)); // [ [ 1, 2, 3 ], [ 1, 3, 4 ], [ 2, 3, 4 ] ]

咦,我写的跟题目要求的结果不是一致的.. 不过不想改了.. (~﹃~)~zZ

think2011 avatar Dec 29 '14 15:12 think2011

var a=[1,2,3,4];

function u(a,i){ var result=[]; var re=[]; function pu(c,d){ var f=d.slice(); c.push(f); } function foo(b,j){ if(j>3) {;if(result.length==2){pu(re,result);}} else { result.push(b[j]); foo(b,j+1); result.pop(b[j]); foo(b,j+1); } } foo(a,i); return re } u(a,0)

witoad avatar Jan 16 '15 13:01 witoad

想到了递归就是没想到怎么个递归法,哈哈,向1楼学习

lzzwoodtree avatar Feb 28 '15 11:02 lzzwoodtree