题解 | #数组分组#

数组分组

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

const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

// 输入行,数字的个数,存放输入的所有数字的数组, 存放三的倍数的数组, 存放5的倍数的数组, 存放不是5的倍数也不是3的倍数的数组
let [row, num, arr, arr3, arr5, arrAny] = [0, undefined, [], [], [], []]
rl.on('line', function (line) {
    row++

    if(row === 1){
        // 获取一共有多少个数字
        num = Number(line)
    }else if(row === 2){
        // 保存所有数字
        arr = line.split(' ').map(Number) 

        // 分类数据
        for(let i = 0;  i < arr.length; i++){
            if(arr[i] % 3 === 0 && arr[i] % 5 !== 0){
                arr3.push(arr[i])
            }else if(arr[i] % 5 === 0 && arr[i] % 3 !== 0){
                arr5.push(arr[i])
            }else if(arr[i] % 5 !== 0 && arr[i] % 3 !== 0){
                arrAny.push(arr[i])
            }
        } 

        /**
         * 得到了是 3的倍数的数组,5的倍数的数组,不是3也不是5的倍数的数组
         * 现在就是要遍历 arrAny数组里面的值如何配置才能发让两个数组的和相等
         * 但是也不一定会相等
         */
        console.log(isEqual(arrSum(arr3), arrSum(arr5), arrAny, 0))
    }

});


// 判断两个数组是否相等
function isEqual(sum1, sum2, arrAny, index){
    if(arrAny.length === index){
        if(sum1 === sum2)   return true
        else    return false
    }else {
        // 递归,不是3也不是5的倍数的数组,其每一项的值都可以随机分配给3的倍数的数组或者5的倍数的数组,所以这里就用 || 运算符
        // 关键就是这里,需要理解理解
        return isEqual(sum1+arrAny[index], sum2, arrAny, index+1) || isEqual(sum1, sum2+arrAny[index], arrAny, index+1)
    }
}

// 求和
function arrSum(arr){
    let sum = 0

    for(let i = 0; i < arr.length; i++){
        sum += arr[i]
    }

    return sum
}

全部评论

相关推荐

小叮当411:应该是1-3个月吧
点赞 评论 收藏
分享
一表renzha:手写数字识别就是一个作业而已
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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