#19. 聚合求汇总值

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

题目描述

有一个二维数组,前面的列为整数,后面的列为double,需要根据整数列进行聚合,并把double列进行求和汇总。 类似sql 的select sum(value) from table group by col1,col2. value 为double列,col1,col2为整数列 输出结果需要对所有整数列按升序排序,即先按第一列升序,第一列值相同比较第二列,依次类推

下面是两个例子:

    Object[][] inputData= new Object[][]{
            new Object[]{0, 1.0,},
            new Object[]{0, 1.0,},
            new Object[]{1, 1.0},
    };

==》

    Object[][] expectResult = new Object[][]{
            new Object[]{0, 2.0,},
            new Object[]{1, 1.0},
    };

    Object[][] inputData= new Object[][]{
            new Object[]{1, 1, 1.0, 2.0},
            new Object[]{0, 0, 1.0, 2.0},
            new Object[]{0, 1, 1.0, 2.0},
            new Object[]{1, 0, 1.0, 2.0},
            new Object[]{0, 0, 1.0, 2.0},
            new Object[]{0, 1, 1.0, 2.0},
    };

===》

    Object[][] expectResult = new Object[][]{
            new Object[]{0, 0, 2.0, 4.0},
            new Object[]{0, 1, 2.0, 4.0},
            new Object[]{1, 0, 1.0, 2.0},
            new Object[]{1, 1, 1.0, 2.0},
    };

输入格式

每个用例中: 第一个值为行数(int),第二个值为整数列个数(int),第三个值为double列个数(int) 后续为每一行的数据,依次为第一列至最后一列,前面【整数列个数】为整数,后面【double列个数】为double

private static void writeData(ObjectOutputStream out, Object[][] data, int intSize, int doubleSize) throws IOException {
    int rowSize = data.length;
    out.writeInt(data.length);
    out.writeInt(intSize);
    out.writeInt(doubleSize);

    for (int i = 0; i < rowSize; i++) {
        Object[] row = data[i];
        for (int j = 0; j < intSize; j++) {
            out.writeInt((int) row[j]);
        }
        for (int j = intSize; j < row.length; j++) {
            out.writeDouble((double) row[j]);
        }

    }
}

输出格式

最终输出为对结果文本加密的一个MD5码。其中结果文本每行中的数据以空格分隔,换行符为"\n",最后一行末尾也有换行符。

示例中第一个用例,结果文本如下

0 2.0
1 1.0

加密后的MD5码为 a6089351f0e29b14b4623831dacc60a7,这个MD5码为最终输出结果

加密方法如下:

private static final char[] HEX_CHARS = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    public static String encrypt(String dataStr) {
        try {
            MessageDigest m = MessageDigest.getInstance("MD5");
            m.update(dataStr.getBytes("UTF8"));
            byte s[] = m.digest();
            String result = new String(encodeHex(s));
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    private static char[] encodeHex(byte[] bytes) {
        char[] chars = new char[32];

        for(int i = 0; i < chars.length; i += 2) {
            byte b = bytes[i / 2];
            chars[i] = HEX_CHARS[b >>> 4 & 15];
            chars[i + 1] = HEX_CHARS[b & 15];
        }
        return chars;
    }

数据范围与提示

用例数据量为一千万,聚合后的分组数不超过100万。