华为机试:合并表记录
题目描述
数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照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++: