华为机试:合并表记录

题目描述

数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。

输入描述:

先输入键值对的个数
然后输入成对的index和value值,以空格隔开

输出描述:

输出合并后的键值对(多行)

示例1

输入

4
0 1
0 2
1 2
3 4

输出

0 3
1 2
3 4

 

Java:将数据存储到二维数组中,然后在Arrays.sort()中重写了Comparator,让其可以直接对二维数组利用某一列进行关键字排序,排序后关键字相同的行均相邻,将相邻的行的值value相加存储到另一个数组中即可。这个方法并没有用库函数。代码长度较长,做题时不宜实现,但时间复杂度、空间复杂度上来讲两者一样,甚至有些小优势。

 1 import java.util.Arrays;
 2 import java.util.Comparator;
 3 import java.util.Scanner;
 4 
 5 public class Main {
 6     
 7     public static void main(String[] args) {
 8         Scanner sc=new Scanner(System.in);
 9         while(sc.hasNext()){
10             int num = sc.nextInt();
11             int[][] nums = new int [num][2];
12             for(int i = 0;i<num;i++){
13                 nums[i][0] = sc.nextInt();
14                 nums[i][1] = sc.nextInt();
15             }
16             
17             Arrays.sort(nums, new Comparator<int[]>(){
18 
19                 @Override
20                 public int compare(int[] o1, int[] o2) {
21                     // TODO Auto-generated method stub
22                     if(o1[0]>o2[0]){
23                         return 1;
24                     }
25                     else{
26                         return -1;
27                     }
28                 }});
29             
30             int count=1;
31             int temp=nums[0][0];
32             for(int i = 1; i<nums.length;i++){
33                 if(temp==nums[i][0]){
34                 }
35                 else{
36                     count++;
37                     temp=nums[i][0];
38                 }
39             }
40             
41             int[][] end = new int[count][2];
42             end[0]=nums[0];
43             int j=0;
44             for(int i = 1; i<nums.length;i++){
45                 if(end[j][0]==nums[i][0]){
46                     end[j][1]+=nums[i][1];
47                 }
48                 else{
49                     j++;
50                     end[j] = nums[i];
51                 }
52             }
53 
54             for(int i = 0; i < end.length; i++){
55                 System.out.println(end[i][0]+" "+end[i][1]);
56             }
57             
58         }
59         sc.close();
60     }
61     
62 }

Java:利用map中的Treemap数据结构,Treemap在构建的过程中直接是关键字有序的,其内部实现为排序二叉树(1.8改为红黑树)。*注:抄袭别人的,不知道这个数据结构,当然红黑树也不清楚。

 1 import java.util.Map;
 2 import java.util.Scanner;
 3 import java.util.TreeMap;
 4 
 5 public class Main {
 6     
 7     public static void main(String[] args) {
 8         Scanner sc=new Scanner(System.in);
 9         while(sc.hasNext()){
10             int num = sc.nextInt();
11             Map<Integer, Integer> m = new TreeMap<>();
12             for(int i = 0; i < num; i++){
13                 int key = sc.nextInt();
14                 int value = sc.nextInt();
15                 if(m.containsKey(key)){
16                     value += m.get(key);
17                     m.put(key, value);
18                 }
19                 else{
20                     m.put(key, value);
21                 }
22             }
23             
24             for (Integer key : m.keySet()) {
25                 System.out.println(key + " " + m.get(key));
26             }
27             
28         }
29         sc.close();
30     }
31     
32 }

C++:

posted @ 2017-09-22 03:23  zdtiio  阅读(431)  评论(0编辑  收藏  举报