题解 | #数据分类处理#
数据分类处理
https://www.nowcoder.com/practice/9a763ed59c7243bd8ab706b2da52b7fd
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// 计算输入行的flag, 整数序列 I, 规则序列R
let [flag, I, R] = [0, undefined, undefined]
rl.on('line', function (line) {
flag++
if(flag === 1){
I = line.split(' ').slice(1)
}else if(flag === 2){
// 去重并从小到大排序
R = line.split(' ').slice(1).filter((item, index,arr)=>{
return arr.indexOf(item) === index
}).sort((a,b)=>a-b)
// 处理成要求输出的格式
/**
* 每一个R下的数字,其对应的符合条件的个数,及符合条件的I下的值及值所对应得下标
* 找打I中所有符合条件的元素,放进各自对应的对象
*/
let res = []
// 一开始初始化,后续出现的整数为 规则的个数
let sum = R.length
for(let i = 0; i < R.length; i++){
// 创建每一个R[i]对应的对象
res.push({elm: R[i], num: 0, arr:[]})
for(let j = 0; j < I.length; j++){
// 判断I的项中是否包含连续的R项
if(I[j].indexOf(R[i]) !== -1){
res[i].num++
res[i].arr.push({index: j, value: I[j]})
// 没有一个数,就会增加2,包括值和下标
sum += 2
}
}
// 如果 R项的num=0,则要减去1
if(res[i].num === 0){
sum--
}else {
// 每项显示的符合的个数
sum++
}
}
/**
* 这一块就是将数据按照要求的格式输出
* 1、去除num=0的
* 2、将每一项的数组的对象数组数据映射成字符数组
* 3、再将数组转成字符串
* 4、将所有项合并成一行,在与总数并行输出
*/
res = res.filter(item=>item.num !== 0)
// ['3 6 0 123 3 453 7 3 9 453456 13 453 14 123', '6 7 1 456 2 786 4 46 8 665 9 453456 11 456 12 786']
res = res.map(item=>`${item.elm} ${item.num} ${item.arr.map(item2=>`${item2.index} ${item2.value}`).join(' ')}`)
console.log(`${sum}`,res.join(' '))
}
});

查看3道真题和解析