题解 | #数组分组#

数组分组

https://www.nowcoder.com/practice/9af744a3517440508dbeb297020aca86

// const rl = require("readline").createInterface({ input: process.stdin });
// var iter = rl[Symbol.asyncIterator]();
// const readline = async () => (await iter.next()).value;

// void (async function () {
//     // Write your code here
//     let arrinput = [];
//     while ((line = await readline())) {
//         arrinput.push(line);
//     }
//     arrnum = arrinput[1].split(" ");
//     // console.log(arrnum);
//     // 创建3个数组,分别存入5的倍数、3的倍数、其余数
//     let arr5 = [];
//     let arr3 = [];
//     let arrother = [];
//     for (let item of arrnum) {
//         // console.log(item%5==false)
//         switch (true) {
//             case item % 5 == 0: //能被5整除,返回true,因此,会执行下面的代码
//                 arr5.push(item);
//                 break;
//             case item % 3 == 0: //能被3整除,返回true,因此,会执行下面的代码
//                 arr3.push(item);
//                 break;
//             default:
//                 //上面的条件都不满足,说明此数不是5和3的倍数,因此,会执行下面的代码
//                 arrother.push(item);
//                 break;
//         }
//     }
//     // 分别求得arr5、arr3的和
//     let sum5 = 0;
//     let sum3 = 0;
//     // for (let item of arr5) {
//     //     if (item != undefined) {
//     //         // 如果非空,那么执行累加
//     //         sum5 += +item;
//     //     }
//     // }
//     // for (let item of arr3) {
//     //     if (item != undefined) {
//     //         // 如果非空,那么执行累加
//     //         sum3 += +item;
//     //     }
//     // }
//     // // 接着求出arrother中项的绝对值的和
//     // let sumother = 0;
//     // for (let item of arrother) {
//     //     if (item != undefined) {
//     //         // 如果非空,那么执行累加
//     //         sumother += Math.abs(item);
//     //     }
//     // }
//     for (let item of arr5) {
//         sum5 += +item;
//     }
//     for (let item of arr3) {
//         sum3 += +item;
//     }
//     // 接着求出arrother中项的相减的绝对值
//     let sumother = 0;
//     // 对除过第一项之外的数字,取反
//     for (let i = 1; i < arrother.length; i++) {
//         arrother[i] = -+arrother[i];
//     }
//     // 然后挨个求和
//     for (let item of arrother) {
//         sumother += +item;
//     }
//     // console.log(sum5, sum3, sumother);
//     // 判断,如果abs(sum5-sum3)==abs(sumother),如果相等,那么可以匹配
//     if (Math.abs(sum5 - sum3) == Math.abs(sumother)) {
//         console.log(true);
//     } else {
//         console.log(false);
//     }
// })();

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    // Write your code here
    let arrinput = [];
    while ((line = await readline())) {
        arrinput.push(line);
    }
    arrnum = arrinput[1].split(" ");
    // console.log(arrnum);
    // 创建3个数组,分别存入5的倍数、3的倍数、其余数
    let arr5 = [];
    let arr3 = [];
    let arrother = [];
    for (let item of arrnum) {
        // console.log(item%5==false)
        switch (true) {
            case item % 5 == 0: //能被5整除,返回true,因此,会执行下面的代码
                arr5.push(+item);
                break;
            case item % 3 == 0: //能被3整除,返回true,因此,会执行下面的代码
                arr3.push(+item);
                break;
            default:
                //上面的条件都不满足,说明此数不是5和3的倍数,因此,会执行下面的代码
                arrother.push(+item);
                break;
        }
    }
    // 求和函数
    function sum(arr) {
        let sum = 0;
        for (let item of arr) {
            sum += +item;
        }
        return sum;
    }
    // 定义回溯函数,挨个分配
    function fun(arr3, arr5, arrother) {
        let result = false;
        function backTracking(arr3, arr5, n) {
            if (result == true) {
                //终止条件
                return;
            } else if (arrother.length == 0) {
                if (sum(arr3) == sum(arr5)) {
                    result = true;
                    return;
                } else {
                    return;
                }
            }
            for (let i = 1; i <= n; i++) {
                let m = arrother.pop();
                if (i == 1) {
                    arr5.push(m);
                } else {
                    arr3.push(m);
                }
                backTracking(arr3, arr5, n);
                arrother.push(m);
                if (i == 1) {
                    arr5.pop();
                } else {
                    arr3.pop();
                }
            }
        }
        backTracking(arr3, arr5, 2);
        return result;
    }
    console.log(fun(arr3, arr5, arrother));
})();

全部评论

相关推荐

06-07 19:59
门头沟学院 C++
补药卡我啊😭:都快15年前的了还在11新特性
你的简历改到第几版了
点赞 评论 收藏
分享
下个早班:秒挂就是不缺人
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务