题目
- 题目描述
数据表记录包含表索引和数值(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。 - 输入描述:
先输入键值对的个数
然后输入成对的index和value值,以空格隔开 - 输出描述:
输出合并后的键值对(多行) - 示例1
- 输入
4
0 1
0 2
1 2
3 4 - 输出
0 3
1 2
3 4
解法
重点::数值必须为正整数,索引小于输入的键值对个数
代码
下面有三种解法,各自的前提条件和解法不同
package org.lht.boot.lang.suanfa;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.*;
/**
* @author haitao.li
* @description: 题目描述
* 数据表记录包含表索引和数值(int范围的正整数),请对表索引相同的记录进行合并,
* 即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
* 输入描述:
* 先输入键值对的个数
* 然后输入成对的index和value值,以空格隔开
* <p>
* 输出描述:
* 输出合并后的键值对(多行)
* <p>
* 示例1
* 输入
* 复制
* 4
* 0 1
* 0 2
* 1 2
* 3 4
* 输出
* 复制
* 0 3
* 1 2
* 3 4
* @date 2021/4/12 9:43
*/
public class Huawei合并表记录 {
/**
* 不受索引大小限制,数值不一定为正整数条件下解题方法
* @param args
* @throws IOException
*/
// public static void main(String[] args) throws IOException {
// BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// int n = Integer.parseInt(reader.readLine());
// Map<Integer, Integer> map = new LinkedHashMap<>();
// while (n > 0) {
// String input = reader.readLine();
// String[] s = input.split(" ");
// int key = Integer.parseInt(s[0]);
// int value = Integer.parseInt(s[1]);
// Integer orDefault = map.getOrDefault(key, 0);
// map.put(key, value + orDefault);
// n--;
// }
// Object[] objects = map.keySet().toArray();
// Arrays.sort(objects);
// for (int j = 0; j < objects.length; j++) {
// System.out.println(objects[j] + " " + map.get(objects[j]));
// }
//
// }
/**
* 正确条件下的解法: 条件:数值必须为正整数,索引小于输入的键值对个数
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(reader.readLine());
int[] arr = new int[n];
while (n > 0) {
String input = reader.readLine();
String[] s = input.split(" ");
int key = Integer.parseInt(s[0]);
int value = Integer.parseInt(s[1]);
arr[key] = arr[key] + value;
n--;
}
for (int j = 0; j < arr.length; j++) {
if (arr[j] == 0) {
continue;
}
System.out.println(j + " " + arr[j]);
}
}
/**
* 牛客题解
* 满足当前题目的最快解法 条件:数值必须为正整数,索引小于输入的键值对个数
*
* @param args
* @throws Exception
*/
// public static void main(String[] args) throws Exception {
// StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
// st.nextToken(); // 分隔符
// int n = (int) st.nval; // 强转
// int[] arr = new int[n];
//
// for (int i = 0; i < n; i++) {
// st.nextToken();
// int key = (int) st.nval;
// st.nextToken();
// int value = (int) st.nval;
// arr[key] = arr[key] + value;
// }
//
// StringBuilder sb = new StringBuilder();
// for (int i = 0; i < arr.length; i++) {
// if (arr[i] != 0) {
// sb.append(i).append(" ").append(arr[i]).append("\n");
// }
// }
// System.out.println(sb.toString());
// }
}
牛客网的解法速度为 9ms以上
下面是我自己的解法