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

