题解 | #数组分组#
数组分组
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 }