#45. 去重记录数

内存限制:1024 MiB 时间限制:20000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
上传者: hiram

题目描述

求分组之后的去重记录数. 类似sql中的selec col,discount(col2) from table group by col.

比如有下列数据(名字,年份)

张三,2018
张三,2019
李四,2018

对名字汇总,年份去重计数后得到

张三,2
李四,1

题目会有两种要求,一种是计算所有汇总后数据,一种只需要计算输出部分数据,上面的例子,如果只输入前一条,结果为

张三,2

输入格式

输入数据为一连串数字,前四个数字为参数信息,后面数字表示一个二维表。 第一个数字表示有多少列 第二个数字表示有多少汇总列,二维表前面的列为汇总列,剩下的列全部为计算去重的列。 第三个数字表示有多少行 第四个数字表示结果取前多少条记录,如果为-1表示取全部记录。

{2, 1, 3, -1, 1, 1, 3, 1, 1, 2};

这个数据会构造出下面的二维表

1,1
3,1
1,2

输入格式为文件IO,可以用下面类似代码获取数据

RandomAccessFile fs = new RandomAccessFile("in", "r");
FileChannel fc = fs.getChannel();
MappedByteBuffer buffer = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
IntBuffer intBuffer = buffer.asIntBuffer();

输出格式

把得到的二维表数字全部加起来,输出为结果。

对于构造出下面的二维表,第一列为汇总列

1,1
3,1
1,2

汇总去重计数后得到

1,2
3,1

全部加起来为7,最终输出结果就为7。

样例

例一

{2, 1, 3, -1, 1, 1, 3, 1, 1, 2};

计算得到

1,2
3,1

最终输出7

例二

{3, 2, 7, 3, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 3, 1, 2, 1, 1, 2, 3, 1, 1, 2, 2}

计算得到

112
211
231

最终输出14