牛客网互联网秋招模拟笔试编程题第三题

来源:互联网 发布:js 数组 map方法 编辑:程序博客网 时间:2024/06/05 07:54

上一篇博文中给出了子问题的解决算法。这里给出完整题目和代码。
题目就贴截图好了:
这里写图片描述
这里写图片描述

var readline = require('readline');const rl = readline.createInterface({    input: process.stdin,    output: process.stdout,    terminal:false});var n = -1;// 初始状态为负数,表示还没开始读取var res = 0;rl.on('line', function(line){ // javascript每行数据的回调接口    if (n < 0) { // 测试用例第一行读取n        n = parseInt(line.trim())    } else {        var tokens = line.split(' ').map(function (x) {            return parseInt(x);        });        var arr=tokens.sort(sortNumber); //将数列从小到大排序        var hm=arr.slice(n); //获取[n+1,3n]顺序区间内的数列        catalanSort(hm,[],[],0);        console.log(res);    }});function sortNumber(a,b) {    return a-b}function catalanSort(arr,firstLine,secondLine,i){ //firstLine存储各分组的中位数    var n=arr.length/2;    if(firstLine.length==n) {   //搜索到叶子节点,得到一组符合条件的中位数        res=getSum(firstLine)>res?getSum(firstLine):res;  //判断该组中位数之和是否最大    }    else {        for (var j = 0; j < 2; j++) {            if (j == 0) {                firstLine.push(arr[i]);            } else {                secondLine.push(arr[i]);            }            if (firstLine.length >= secondLine.length) { //约束条件判断                catalanSort(arr,firstLine,secondLine,i+1);  //符合条件,扩展搜索空间            }            //回溯前,清楚上一步占用的空间状态            if(j==0){                firstLine.pop();            }else{                secondLine.pop();            }        }    }}function getSum(arr){  //计算数组中所有项之和    return arr.reduce(function(x,y){        return parseInt(x)+parseInt(y);    });}
原创粉丝点击