我们把形如 1->2 的路径称作表1到表2的关联,如果存在 1->2, 1->3, 2->4, 3->4, 那么表1到表4则有两条路径分别为: 1->2->4 1->3->4,
现给出一组关联(两表关联),计算这些表中的所有路径信息并输出
用例为一个2列的文本文件,每一行代表着表->表的关联,如 1 2 则代表表1->表2的关联,两数据之间有空格,每行数据最后有换行符"\n",样例数据第一列的表id为顺序排列(1,2,3...)
最终输出为对结果文本加密的一个MD5码。 其中结果文本每行数据第一列为起点表,第二列为终点表,随后将路径经过的表id依次列出(包括头尾),以冒号加空格隔开 如 1->5->6->11->2 则输出为 1 2: 1 5 6 11 2 两两数据间有空格,末尾有换行符"\n",最后一行也有换行符 对于这些字符串,输出要求排序,每行按字符串排序,即11 3: 11 4 3 在2 3: 2 4 3前面
对结果文本加密方法如下:
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; }
输入:
1 2 1 3 2 1 2 3 3 4 4 1
结果文本如下:
1 2: 1 2 1 3: 1 2 3 1 3: 1 3 1 4: 1 2 3 4 1 4: 1 3 4 2 1: 2 1 2 1: 2 3 4 1 2 3: 2 1 3 2 3: 2 3 2 4: 2 1 3 4 2 4: 2 3 4 3 1: 3 4 1 3 2: 3 4 1 2 3 4: 3 4 4 1: 4 1 4 2: 4 1 2 4 3: 4 1 2 3 4 3: 4 1 3
对结果文本加密后的最终输出:
4c0c3de66f4d6a1021f2e82669e3ab29
表以及关联数量在1000以下