首页 > 试题广场 >

合并表记录

[编程题]合并表记录
  • 热度指数:767044 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。


提示:
0 <= index <= 11111111
1 <= value <= 100000


输入描述:

先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开



输出描述:

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

示例1

输入

4
0 1
0 2
1 2
3 4

输出

0 3
1 2
3 4
示例2

输入

3
0 1
0 2
8 9

输出

0 3
8 9
import java.util.*;
import java.lang.*;
import java.text.*;
import java.math.*;
import java.util.stream.Collectors;
import static java.util.Map.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
		while(sc.hasNext())
        {
			int num = sc.nextInt();
            Map<Integer,Integer> map=new HashMap();
            for(int i=0;i<num;i++){
                int key = sc.nextInt();
                int value = sc.nextInt();
                map.put(key,map.getOrDefault(key,0)+value);
            }
			List<Entry<Integer, Integer>> collect = map.entrySet().stream().sorted((o1, o2)->{
                return o1.getKey() - o2.getKey();
                }
            ).collect(Collectors.toList());
            for (Entry<Integer, Integer> entry : collect) {
                System.out.println(entry.getKey()+" "+entry.getValue());
            }
        }
		sc.close();
    }
}


发表于 2022-05-22 16:03:04 回复(0)
#include<stdio.h>
struct data{  //构造结构体类型
    int index;
    int value;
};
int main(void)
{
    struct data temp[500]; //创建结构体数组
    int n;
    scanf("%d",&n);//输入个数n
    for(int i=0;i<n;i++)
    {
        scanf("%d %d",&temp[i].index,&temp[i].value);//输入下标值与内容值
    }
    //选择排序,将具有相同下标值的结构体数组元素变为相邻的
    for(int i=0;i<n-1;i++)
    {
        int min=i,j;
        for(j=i+1;j<n;j++)
        {
            if(temp[min].index>temp[j].index)
            {
                min=j;
            }
        }
        if(min!=j)
        {
            struct data ll=temp[i];
            temp[i]=temp[min];
            temp[min]=ll;
        }
    }
    /*将相邻的结构体数组元素的下标值进行比较,若相同则将下标大的内容值加到小标小
    的元素中,再将下标大的元素的下标值置为 -1*/
    for(int k=n-1;k>0;k--)
    {
        if(temp[k].index==temp[k-1].index)
        {
            temp[k-1].value+=temp[k].value;
            for(int j=k;j<n-1;j++)
            {
                temp[k]=temp[k+1];
            }
            temp[k].index=-1;
        }
    }
    //遍历输出数组元素,注意判断其下标值是否为 -1,不是就输出,否则不输出
    for(int i=0;i<n;i++)
    {
        if(temp[i].index!=-1)
        printf("%d %d\n",temp[i].index,temp[i].value);
    }
    return 0;
}

发表于 2022-04-03 15:12:11 回复(0)
写了个hash表来做。解决冲突的策略,不晓得怎么回事的,很郁闷,会超出数组范围,以为index会再0->11111111之间均匀分布,第一个策略是kv->key*499/11111111;提示溢出啥的,,给的实例基本上index<250,第二个策略kv->key*499/500;最后给个index=11111111的实例,又炸了。
#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAXSIZE 500
typedef enum{OK=0,ERROR}Status;
typedef struct
{
    int key;
    int value;
}key_value;
void swap(int array[],int i,int j)
{
    int temp=array[i];
    array[i] = array[j];
    array[j]=temp;
}
void Sort(int array[],int count)
{
    int i=0,j=0;
    for(i=0;i<count-1;i++)
    {
        for(j = i+1;j<count;j++)
            if(array[i]>array[j])
                swap(array,i,j);
    }
    /*
    for(i=0;i<count-1;i++)
    {
        for(j = 0;j<count-1-i;j++)
            if(array[j]>array[j+1])
                swap(array,j+1,j);
    }
    */
}
/*
* index 0->11111111
*return 0->499
*
*/
int hash(key_value Table[],key_value* kv)
{
    int i,temp,temp2,temp3;
    temp = kv->key*499/500;
    if(kv->key>=500)temp = kv->key*499/11111111;
    i=0;
    if(Table[temp].key==-1||Table[temp].key==kv->key)
    {
        return temp;
    }
    i=1;
    while(1)
    {
        temp2 = temp + i;
        temp3 = temp - i;
//         temp2 = temp + pow(2,i);
//         temp3 = temp - pow(2,i);
        if(temp2>=500&&temp3<0)return -1;
        if(Table[temp2].key==-1||Table[temp2].key==kv->key)
        {
            temp=temp2;
            break;
        }
        if(Table[temp3].key==-1||Table[temp3].key==kv->key)
        {
            temp=temp3;
            break;
        }
        i++;
    }
    return temp;
}

Status TableInsert(key_value Table[],key_value* kv)
{
    int i,temp;
    temp = hash(Table,kv);
    if(temp == -1)return ERROR;
    Table[temp].key = kv->key;
    Table[temp].value += kv->value;
    return OK;
}
Status TableGet(key_value Table[],key_value* kv)
{
    int i,temp;
    temp = hash(Table,kv);
    if(temp == -1)return ERROR;
    if(Table[temp].key==-1)return ERROR;
    kv->key=Table[temp].key;
    kv->value = Table[temp].value;
    return OK;
}
int main()
{
    int count=0;
    int i=0,j,index,value;
    key_value kv[500],kvt;
    int sort[500];
    memset(sort,0,sizeof(sort));
    while(i<500)
    {
        kv[i].key=-1;
        kv[i].value=0;
        i++;
    }
    scanf("%d",&count);
    i=0;
    while(i<count)
    {
        scanf("%d",&kvt.key);
        sort[i]=kvt.key;
        scanf("%d",&kvt.value);
        if(TableInsert(kv,&kvt)==ERROR)return 1;
        i++;
    }
    Sort(sort,count);
    i=0;
    while(i<count)
    {
         if(sort[i]!=sort[i+1])
         {
              kvt.key=sort[i];
              if(TableGet(kv,&kvt)==ERROR)return 1;
              printf("%d %d\n",kvt.key,kvt.value);
         }
         i++;
    }
    return 0;
}



发表于 2022-03-27 20:48:14 回复(0)
这个题目是改过吗?我看排行里面Java第一个根本不得行
发表于 2022-02-18 19:12:04 回复(1)
为什么我写的代码能在vs上运行,但是复制粘贴过来结果就不一样了呢,有没有大神知道原因啊

发表于 2022-02-02 14:04:12 回复(2)
#include<stdio.h>

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int n;
    int a[500] = { -1 }, b[500] = { 0 };
    for (int i = 0; i < 500; i++) {
        a[i] = -1;
    }
    scanf("%d", &n);
    int i = 0;
    while (n != 0) {
        int  index, value;
        scanf("%d  %d", &index, &value);
        int j = 0;
        do {
            if (a[j] == index) {
                b[j] += value;
                break;
            }
            else {
                j++;
            }
        }while (j < i);
        if (j >= i) {
            a[i] = index;
            b[i] = value;
            for (int k = 0; k <= i; k++) {
                if (a[k] > a[i]) {
                    swap(&a[k], &a[i]);
                    swap(&b[k], &b[i]);
                }
            }
            i++;
        }
        n--;   
    }
    for (int i = 0; i < 500; i++) {
        if (b[i]) {
            printf("%d %d\n", a[i], b[i]);
        }
    }
    return 0;
}
发表于 2022-01-07 15:15:21 回复(0)

运用一个数学上的小技巧:

  1. 已知题目输入键值对的个数 n(1 <= n <= 500)可以让输入的key乘上键值对的最大值然后加上索引值放到key数组里,输入的value放在value数组的对应索引里,遇到相同的key值就在对应位置上累加value,这样我们可以得到两个数组,相同的索引(数组下标)即是key对应的value。
  2. 然后我们对key数组进行排序,因为索引值一定会小于等于输入键值对的个数,所以索引值并不会影响排序结果,排序仍会按照key的大小进行排序
  3. 最后我们按照排序后的key数组进行输出,key[i]对键值对的最大值整除即可得到key值,取余得到索引即可在value数组中找到对应的value值。
#include
#define MAX 500
#define long long size_t
int cmp(size_t *a, size_t *b){
    return (int)(*a - *b);
}
int main(){
    int num = 0, temp1 = 0, temp2 = 0, size = 0, flag = 0;
    scanf("%d\n",&num);
    size_t *key = malloc(num*sizeof(size_t));
    int *value = malloc(num*sizeof(int));
    memset(key,-1,num*sizeof(size_t));
    for(int i=0; i<num; i++){
        flag = 1;
        scanf("%d %d\n",&temp1,&temp2);
        for(int a=1; a<=size; a++){
             if(temp1 == key[a]/MAX){
                 value[a] += temp2;
                 flag = 0;
             }
        }
        if(flag){
            size++;
            key[size] = (temp1*MAX)+size;
            value[size] = temp2;
        }
    }
    qsort(key,size+1,sizeof(size_t),cmp);
    for(int j = 1; j<=size; j++){
        printf("%d %d\n",key[j]/MAX,value[key[j]%MAX]);
    }
}
发表于 2021-10-11 15:42:36 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s;
        while ((s = br.readLine()) != null) {
            TreeMap<Integer, Integer> map = new TreeMap<>();
            for (int i = 0; i < Integer.parseInt(s); i++) {
                String[] kv = br.readLine().split(" ");
                int key = Integer.parseInt(kv[0]), value = Integer.parseInt(kv[1]);
                map.put(key, map.getOrDefault(key, 0) + value);
            }
            for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
                System.out.println(entry.getKey() + " " + entry.getValue());
            }
        }
    }
}

发表于 2021-10-02 10:38:12 回复(0)
count = int(input(''))
d = {}
for i in range(count):
    k, v = map(int, input('').split(' '))
    if k in d:
        d[k] += v
    else:
        d[k] = v
res = sorted(d.items(),key=lambda item:item[0])
for r in res:
    print('{} {}'.format(r[0], r[1]))

发表于 2021-09-05 22:35:42 回复(0)
#输入键值对个数
n = int(input())
l1 = []
l2 = []
#键值分别出存在l1和l2中
for i in range(n):
    a,b=input().split()
    a = int(a)
    b = int(b)
#如果键重复,则对应的值做加法运算
    if a in l1:
        d = l1.index(a)
        l2[d] += b
    else:
        l1.append(a)
        l2.append(b)
#将新的键值对合并到新的列表l中,排序后输出
l = list(zip(l1,l2))
l.sort()
for each in l:
    print(each[0],each[1])

发表于 2021-06-06 13:20:27 回复(0)
用js完成:
可以用map数据接口,key值可以为任何值,组成键值对,然后用map.has()去对比,如果有,就value相加,如果没有,就map.set
// 循环取出每一个键值个数
// 新建一个map  { key: value, key:value },
// 判断map是否有这个key,有key的话,value相加,没有就塞进map中
// 最终结果 取出所有的key,对key进行排列, 按照key值从map中取出value输出
function sys() {
    let map = new Map();
    var line = [];
    while(line=readline()) {
        var arr = line.split(' ');
        if (arr.length == 2) {
            if (map.has(arr[0])) {
                var val = map.get(arr[0]);
                map.set(arr[0], Number(val) + Number(arr[1]));
            } else {
                map.set(arr[0], arr[1]);
            }
        }
        
    }
    var keysArr = [];
    for (var s of map.keys()) {
        arrKeys.push(s);
    }
    keysArr.sort((a,b) => {return a - b});
    keysArr.map((item) => {
        console.log(item + ' ' + map.get(item));
    })
}
sys();


发表于 2021-05-27 21:23:51 回复(0)
public static void main(String[] args) {
        TreeMap<Integer, Integer> treeMap = new TreeMap<>();
        Scanner sc = new Scanner(System.in);
        int num = Integer.parseInt(sc.nextLine());
        while (num>0) {
            String str = sc.nextLine();
            String[] mapStr = str.split(" ");
            Integer key = Integer.valueOf(mapStr[0]);
            Integer value = Integer.valueOf(mapStr[1]);
            if (!treeMap.containsKey(key)) {
                treeMap.put(key, value);
            } else {
                treeMap.put(key, treeMap.get(key) + value);
            }
            num--;
        }
        for (Map.Entry<Integer, Integer> entry : treeMap.entrySet()) {
            System.out.println(entry.getKey() + " " + entry.getValue());
        }
    }

发表于 2021-04-15 22:28:33 回复(0)
import java.util.*;

public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int nums = sc.nextInt();
        Map<Integer,Integer> map = new TreeMap<>();
        for(int i=0;i<nums;i++){
            int index = sc.nextInt();
            int value = sc.nextInt();
            map.merge(index,value, Integer::sum);
        }
        map.forEach((k,v)->{
            System.out.println(k+" "+v);
        });
    }
}

编辑于 2021-04-03 22:21:13 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main() {
    // map:有序,红黑树             适用性:对于顺序要求高的问题,适用map会更高效点
    //unordered_map:无序,哈希表     适用性:对于查找问题更加高效
    map<int, int> hash; 
    int n;
    cin >> n;
    while(n--) {
        int a, b;
        cin >> a >> b;
        hash[a] += b;
    }
    for (auto& v : hash) {
        cout << v.first << " " << v.second << endl;
    }
    return 0;
}

发表于 2021-03-28 23:12:32 回复(0)
判断用Map的containsKey方法更好,我这里自己写的判断
import java.util.*;
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan=new Scanner(System.in);
		while(scan.hasNext())
		{
			int num=scan.nextInt();
			Map<Integer,Integer> map=new TreeMap<Integer,Integer>();
			for(int i=0;i<num;i++)
			{
				int key=scan.nextInt();
				int value=scan.nextInt();
				for(Integer j:map.keySet())
				{
					if(key==j)
					{
						value=value+map.get(j);
					}
				}
				map.put(key,value);
			}
			
			for(Map.Entry<Integer,Integer> entry:map.entrySet())
			{
				System.out.println(entry.getKey()+" "+entry.getValue());
			}
		}
	}

}



发表于 2020-09-08 16:18:57 回复(1)
python的defaultdict字典吧,很适用
from collections import defaultdict as ddict
while True:
    try:
        n, hashnum = int(input()), ddict(int)
        for _ in range(n):
            x, y = map(int, input().split())
            hashnum[x] += y
        for i in sorted(hashnum.keys()):
            print(i, hashnum[i])
    except:
        break


发表于 2020-08-27 15:21:20 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        Map<Integer, Integer> result = new TreeMap<Integer, Integer>();
        int pairs = 0;
        if (scanner.hasNextInt()){
            pairs = scanner.nextInt();
        }
        for (int i = 0; i < pairs; i++){
            int idx = scanner.nextInt();
            int value = scanner.nextInt();
            if (result.containsKey(idx)){
                result.put(idx,result.get(idx) + value);
            }
            else{
                result.put(idx,value);
            }
        }
        for (Integer key : result.keySet()){
            System.out.printf("%d %d%n",key, result.get(key));
        }
    }
}

发表于 2020-08-18 17:00:34 回复(0)
这个map类厉害了啊,代码简洁

#include <iostream>
#include <map>
using namespace std;
int main()
{
    int n;
    map<int,int> m;
    cin>>n;
    while(n--)
    {
        int key,vaule;
        cin>>key>>vaule;
        m[key]=m[key]+vaule;
    }
    for(auto i=m.begin();i!=m.end();i++)
        cout<<i->first<<" "<<i->second<<endl;
    return 0;
}
}

发表于 2020-08-12 22:05:58 回复(0)
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            int size = scanner.nextInt();
            if (size < 1) {
                continue;
            }
            TreeMap<Integer, Integer> treeMap = new TreeMap<>();
            for (int i = 0; i <= size; i++) {
                String line = scanner.nextLine().trim().replaceAll("\\s", " ");
                String[] arr = line.split(" ");
                if (arr.length != 2) {
                    continue;
                }
                try {
                    int first = Integer.parseInt(arr[0]);
                    int second = Integer.parseInt(arr[1]);
                    if(treeMap.containsKey(first)){
                        int newValue = treeMap.get(first) + second;
                        treeMap.put(first, newValue);
                    } else {
                        treeMap.put(first, second);
                    }
                } catch (NumberFormatException e) {
                    continue;
                }
            }
            treeMap.forEach((key, value) -> System.out.println(key + " " + value));
        }
    }

发表于 2020-08-08 15:09:23 回复(0)
#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int NumberCount=0;
    while(cin>>NumberCount)
    {
       vector<int> Number(NumberCount,0);
       int   Index=0,Value=0;
       for(int i=0;i<NumberCount;i++)
       {
          cin>>Index;
          cin>>Value;
          Number[Index]=Number[Index]+Value;
       }
       for(int i=0;i<NumberCount;i++)
       {
           if(Number[i]>0)
           {
              cout<<i<<" "<<Number[i]<<endl;
           }
       }
    }
    return 0;
}
C++解法
发表于 2020-08-03 17:06:40 回复(0)

问题信息

难度:
1710条回答 105683浏览

热门推荐

通过挑战的用户

查看代码
合并表记录