58 笔试

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param m int整型 数值范围大小
 * @param n int整型 取其中多少个数字
 * @return int整型二维数组
 */
function getCombineArr(m, n) {

    let resArr = []
    // inArr是传进来的一个加了新数的数组
    function work(inArr) {
        if (inArr.length === n) {
            // 当传进来的数组的长度等于需要的长度时push这个数组到结果数组里面
            resArr.push(inArr);
            return
        }
        // 长度不到
        if (inArr.length < n) {
            let lastVal = inArr[inArr.length - 1];
            // 从数组末尾的那个数的下一个数开始,直到结束   如果到了结束的数长度还是不够呢? for循坏不会调用新的work了
            for (let j = lastVal + 1; j <= m; j++) {
                inArr.push(j)
                let newArr = new Array(...inArr)
                inArr.pop();
                console.log(newArr);
                work(newArr)
            }
        }
    }


    for (let i = 1; i <= m - n + 1; i++) {
        console.log(i);
        work([i])
    }
    // work([1])
    console.log(resArr);
}

getCombineArr(3, 2)




// 题目二
// 经典的dp算法

// 转移方程dp[i] = dp[i - 1] + 1

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param nums int整型一维数组 初始数组
 * @return int整型
 */
function lengthOfNums(nums) {
    // write code here
    let maxVal = 1;
    let dp = new Array(nums.length).fill(1)
    console.log(dp);
    for (let i = 0; i < nums.length; i++) {
        for (let j = 0; j < i; j++) {
            if (nums[i] > nums[j]) {
                dp[i] = Math.max(dp[j] + 1, dp[i])
                // 若大于取dp最大值
            }
            console.log("do");
        }
        maxVal = Math.max(dp[i], maxVal)
        console.log(`dp[i]is +${dp[i]} and maxVal is ${maxVal}`);
        // console.log(maxVal);
    }
    // console.log(maxVal);
    return maxVal
}
lengthOfNums([10, 9, 2, 5, 3, 7, 101, 18])
console.log(res);


// 题目3

function findSurveyArr(surveyPosArr, totalDistance) {
    let resArr = [];
    // 还是用类似dp的做法  dp存储在这个区间内小于totalDistance的数组,
    // 这题应该是要求速度空间的算法   或者是递归???
    for (let i = 0; i < surveyPosArr.length; i++) {
        // let s = [].push(surveyPosArr[i]
        console.log([surveyPosArr[i]]);
        work([surveyPosArr[i]], surveyPosArr[i], i)

    }
    function work(arr, sum, lastIndex) {
        if (lastIndex >= surveyPosArr.length) return
        // 下标超出
        let val = surveyPosArr[lastIndex + 1]
        if (sum + val > totalDistance) work(arr, sum, ++lastIndex)
        if (sum + val === totalDistance) resArr.push(arr.concat(val))
        work(arr.concat([val]), sum + val, ++lastIndex)
    }
    console.log(resArr);
}
findSurveyArr([10, 1, 2, 7, 6, 1, 5], 8)

难度不大,但是第一题真的浪费太多时间,第三题差一点点就写出来了 真的可惜

#笔试复盘#
全部评论

相关推荐

评论
1
1
分享
牛客网
牛客企业服务