• 华为机试:合并表记录


    题目描述

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

  • 相关阅读:
    HTML-代码定义
    数组
    for。。。for嵌套if,if嵌套for。
    输入年月日, 判断输入的是否正确
    日期功能
    方程
    5.8 一维数组
    5.9 二维数组
    5.7 类
    5.4穷举,迭代
  • 原文地址:https://www.cnblogs.com/zdtiio/p/7572621.html
Copyright © 2020-2023  润新知