首页 > 试题广场 >

合并表记录

[编程题]合并表记录
  • 热度指数:725285 时间限制: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
//花了大概两天debug,一言难尽。注释如下。
#define CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//功能:打印二维数组
void print_2D_array(int kv[][2], int rows) {
    int i = 0;
    for (i = 0; i < rows; i++) {
        printf("%d %d\n", kv[i][0], kv[i][1]);
    }
}

/*
 * @brief:删除二维数组里第二列是0的行。
 * @note:行数肯定会减少,所以要使用指针更新原rows。
*/
void proc_del_zero(int kv[][2], int* rows) {
    int i = 0, new_rows = 0;
    for (i = 0; i < *rows; i++) {
        if (kv[i][1] != 0) {
            kv[new_rows][1] = kv[i][1];
            kv[new_rows][0] = kv[i][0];
            new_rows++;
        }
    }
    *rows = new_rows;
}

/*
 * @brief:将相同索引的数值进行求和运算
 * @param:**kv:待处理的二维数组
 * @param:rows:待处理的二维数组的行数,也是键值对的个数
 * @retval:NONE
 * @note:第0列是key,第1列是value。
*/
void proc_sum(int kv[][2], int rows) {
    int i = 0, j = 0;
    for (i = 0; i < rows; i++) {
        for (j = i + 1; j < rows; j++) {
            if (kv[i][0] == kv[j][0]) {
                kv[i][1] += kv[j][1]; //求和
                kv[j][1] = 0; //被加过的元素置零,防止多次被加。
            }
        }
    }
}

/*
 * @brief:按照key值升序排列二维数组
 * @param:kv[][2]:待处理的二维数组
 * @param:rows:待处理的二维数组的行数,也是键值对的个数
 * @retval:NONE
 * @note:第0列是key,第1列是value。本次使用选择排序算法。
*/
void proc_upsort(int kv[][2], int rows) {
    // 检查数组是否有元素
    if (rows <= 0) return;

    int i = 0, j = 0;
    int min = 0;
    int temp[1][2] = {0};
    for (i = 0; i < rows; i++) {
        min = i;
        for (j = i + 1; j < rows; j++) {
            if (kv[min][0] > kv[j][0]) {
                min = j; //拿到最小key值对应的行数字
            }
        }

        //交换kv[i]行的数据和kv[min]行的数据
        temp[0][0] = kv[i][0];
        temp[0][1] = kv[i][1];
        kv[i][0] = kv[min][0];
        kv[i][1] = kv[min][1];
        kv[min][0] = temp[0][0];
        kv[min][1] = temp[0][1];
    }
}



int main() {
    int couples = 0; //键值对的个数,也是二维数组的行数。
    int key_value[501][2] = {0}; //根据题目,做多500行2列,第一列键,第二列值。
    int i = 0;
    scanf("%d", &couples);

    if (couples < 1 || couples > 500) //键值对的个数必须1 <= n <= 500
        exit(-1);

    for (i = 0; i < couples; i++) { //循环输入键值对
        scanf("%d %d", &key_value[i][0], &key_value[i][1]);

        if (key_value[i][0] < 0 || key_value[i][0] > 11111111)
            exit(-1); //必须 0 <= index <= 11111111

        if (key_value[i][1] < 1 || key_value[i][1] > 100000)
            exit(-1); //必须 1 <= value <= 100000
    }

    proc_sum(key_value, couples);      //键相同的行,对值求和,求完和的行把其value清零。
    proc_del_zero(key_value, &couples); //删除二维数组里第二列是0的行
    proc_upsort(key_value, couples);    //做完前面的步骤后,把每一行按照key的值升序
    print_2D_array(key_value, couples); //打印二维数组

    return 0;
}


发表于 2024-04-14 21:56:50 回复(1)
#include "stdio.h"
#include "string.h"
#include <ctype.h>
//思路:分成三个部分,求和,排序,输出。注意测试用例里给的数据是乱序所以必须排序。
//这个代码有一个问题,就是循环相加的部分只能处理index只有两个相同的部分,三个及以上就会漏,不知道怎么回事和怎么补救,还好例子里最多三个,因此用了两遍就过了。
void upper_bubble_sort_for_IA(int index[], int value[],int n)
{
    int i,j,tempv,tempi;
    for(i = 0; i <n; i++)
    {
        for(j = 0; j < n - 1- i; j++)
        {
            if(index[j] > index[j+1])
            {
                tempv = value[j];
                value[j] = value[j+1];
                value[j+1] = tempv;
                tempi = index[j];
                index[j] = index[j+1];
                index[j+1] = tempi;
            }
        }
    }
}
int main()
{
    //输入部分
    int n,i,a;
    //struct IA inva;
    scanf("%d",&n);
    int index[500] = {0},value[500] = {0};
    for(i = 0; i < n; i++)
    {
        scanf("%d",&index[i]);
        scanf(" %d", &value[i]);
    }
    //比较并求和部分
    
        for (i = 0; i < n; i++) 
        {
            for(a = 1; a < n - 1 -i; a++)
            {
                if(index[i] == index[i+a]&& value[i+a] !=0)
                {
                    value[i] = value[i] + value[i+a];
                    value[i+a] = 0;
                }
            }
        }
    
    //排序
    upper_bubble_sort_for_IA(index,value,n);
    for (i = 0; i < n; i++) 
        {
            for(a = 1; a < n -i; a++)
            {
                if(index[i] == index[i+a]&& value[i+a] !=0)
                {
                    value[i] = value[i] + value[i+a];
                    value[i+a] = 0;
                    //a = 1;
                    //i = 0;
                }
            }
        }
    //输出
    for(i = 0; i < n; i++)
    {
        if (value[i] !=0) 
        {
            printf("%d %d\n",index[i],value[i]);
        }
    }
}

编辑于 2024-03-29 01:14:25 回复(0)
#include <stdio.h>
int main() {
    int n, index, value; int count = 0;/*count表示被合并的表项数*/
    scanf("%d", &n);
    int Index[500];
    for (int i = 0; i < 500; i++)
        Index[i] = -1;
    int Value[500] = { 0 };
    for (int i = 0; i<n; i++)
    {
        scanf("%d %d", &index, &value);
        int tag = 0;
        for (int j = i-1; j >= 0; j--)
            if (Index[j] == index)
            {
                Value[j] += value;
                tag = 1;
                count++;
                break;
            }
        if (tag == 0)
            {
                Index[i] = index;
                Value[i] = value;
            }

       
    }
    n = n - count;
    int Indexcopy[500];/*直接使用Index数组也能得到题目要求的答案,这里复制一份是为了保留原来的结果*/
    for(int i = 0; i < 500; i++)
        Indexcopy[i] = Index[i];
    for (int k = 0; k < n; k++)
    {
        int minIndex = 11111111; int t;/*t表示indexcopy数组中最小值所在的数组元素的下标*/
        for (int a = 0; a < 500; a++)
            if (Indexcopy[a] != -1 && minIndex>=Indexcopy[a])
            {
                minIndex = Indexcopy[a];
                t = a;
            }
        Indexcopy[t] = -1;
        printf("%d %d\n", Index[t], Value[t]);
    }
    return 0;
}
发表于 2024-03-08 22:34:19 回复(0)
#include <stdio.h>

int main() {
    int count=0,vari=0,i=0,j=0,index=0;
    scanf("%d",&count);
    long int a[500][2],b[500][2];
    for(i=0;i<count;i++)
    {
        scanf("%ld %ld",&a[i][0],&a[i][1]);
    }

    for(i=0;i<count;i++){
        for(j=0;j<count;j++){
            if(a[i][0]==b[j][0])     break;
        }
        if(j>=vari)
        {
            index = vari;
            b[index][0] = a[i][0];
            b[index][1] = a[i][1];
            vari++;
        }else{
            index = j;
            b[index][1] = b[index][1]+a[i][1];
        }

    }

    long int temp[2];

    for(i=0;i<vari-1;i++){
        for(j=0;j<vari-1-i;j++){
            if(b[j][0]>b[j+1][0]){
                temp[0] = b[j][0];
                temp[1] = b[j][1];
                b[j][0] = b[j+1][0];
                b[j][1] = b[j+1][1];
                b[j+1][0] = temp[0];
                b[j+1][1] = temp[1];
            }
        }
    }

    for(j=0;j<vari;j++){
        printf("%ld %ld\n",b[j][0],b[j][1]);
    }

    return 0;
}


发表于 2024-03-08 20:12:57 回复(0)
#include <stdio.h>

int main() {
    int index[501]={-1}, value[501]={-1},i,j,n,temp1,temp2;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d %d",&index[i],&value[i]);
    }
    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(index[i]==index[j])
            {
                value[i]=value[i]+value[j];
                index[j]=-1;
            }
        }

    }
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-1;j++)
        {
            if(index[j]>index[j+1])
            {
                temp1=index[j];
                temp2=value[j];
                index[j]=index[j+1];
                value[j]=value[j+1];
                index[j+1]=temp1;
                value[j+1]=temp2;
            }
        }

    }
    for(i=0;i<n;i++)
    {
        if(index[i]>=0)
        printf("%d %d\n",index[i],value[i]);
    }

    return 0;
}

发表于 2024-03-06 16:30:42 回复(0)
#include <stdio.h>

int main() {
    int num[500][2] = {0};
    int n = 0, i = 0, j = 0;
    scanf("%d", &n);
    for(i = 0; i < n; i++) {
        scanf("%d %d", &num[i][0], &num[i][1]);
    }
    for(i = 0; i < n - 1; i++) {
        for(j = i+1; j < n; j++) {
            int index = 0, value = 0;
            if (num[j][1] == 0) {
                continue;
            }
            if(num[i][0] > num[j][0]) {
                index = num[i][0];
                value = num[i][1];
                num[i][0] = num[j][0];
                num[i][1] = num[j][1];
                num[j][0] = index;
                num[j][1] = value;
            } else if(num[i][0] == num[j][0]) {
                num[i][1] += num[j][1];
                num[j][1] = 0;
            }
        }
    }
    for(i = 0; i < n; i++){
        if (num[i][1] == 0) {
            continue;
        }
        printf("%d %d\n", num[i][0], num[i][1]);
    }
    return 0;
}
编辑于 2024-02-28 23:46:07 回复(0)
为什么单步调试能通过,直接运行就不行啊,求大佬解答
#include <stdio.h>
#include <stdlib.h>

int main() {
    unsigned int line_num,temp_key,temp_valu,curr_value,curr_key = 0;
    scanf("%d",&line_num);
    while(line_num --){
        scanf("\n%u%u",&temp_key,&temp_valu);
        if(curr_key < temp_key){
            printf("%d %d\n",curr_key,curr_value);
            curr_key = temp_key;
            curr_value = 0;
        }
        curr_value += temp_valu;
    }
    printf("%d %d\n",curr_key,curr_value);
}


发表于 2024-02-20 11:04:52 回复(0)
我服,没考虑等于最大值的情况。。。硬丢一分
#include <stdio.h>
int HashTable[11111112] = {0};

int main() {
    int Num = 0;
    scanf("%d",&Num);
    int IndexTemp = 0,ValueTemp = 0;
    for(int i = 0;i< Num;i++)
    {
        IndexTemp = 0,ValueTemp = 0;
        scanf("%d %d",&IndexTemp,&ValueTemp);
        if(HashTable[IndexTemp] == 0)
        {
            HashTable[IndexTemp] = ValueTemp;
        }else
        {
            HashTable[IndexTemp] += ValueTemp;
        }
    }
    for(int j = 0;j < 11111112;j++)
    {
        if(HashTable[j] != 0)
        {
            printf("%d %d\r\n",j,HashTable[j]);
        }
    }
    return 0;
}


编辑于 2024-01-05 16:25:49 回复(2)
//用二维数组,过程也只是平常思路
#include <stdio.h>

int main() {
    int n, inx, val;
    scanf("%d", &n);
    int arr[n][2];
    for (int i = 0; i < n; i++) {
        scanf("%d %d", &arr[i][0], &arr[i][1]);
    }
    for (int i = n - 1; i > 0; i--) {
        for (int j = n - 2; j >= 0; j--) {
            if (i != j) {
                if (arr[i][0] == arr[j][0]) {
                    arr[i][1] += arr[j][1];
                    arr[j][0] = 0;
                    arr[j][1] = 0;
                }
            }
        }
    }
    for (int j = 0; j < n; j++) {
        for (int i = 0; i < n - j - 1; i++) {
            if (arr[i][0] > arr[i + 1][0]) {
                inx = arr[i][0];
                val = arr[i][1];
                arr[i][0] = arr[i + 1][0];
                arr[i][1] = arr[i + 1][1];
                arr[i + 1][0] = inx;
                arr[i + 1][1] = val;
            }
        }
    }
    for (int i = 0; i < n; i++) {
        if (arr[i][0] != 0 || arr[i][1] != 0) {
            printf("%d %d\n", arr[i][0], arr[i][1]);
        }
    }
    return 0;
}

编辑于 2023-12-23 12:30:39 回复(0)
#include <stdio.h>

int main() {
    int a, b;
    struct data{
        int index;
        int value;
    }temp;
    struct data D[501];
    int n;
    int i = 0, j = 0;//j代表当前存到了第几个数字+1(未存);
    int m = 0, v = 0;
    scanf("%d",&n);
    for (; i<n; i++) {
        int cun = 0;
        scanf("%d %d",&m,&v);
        for(int k=0; k<j; k++){
            if(D[k].index == m){
                D[k].value += v;
                cun = 1;
            }
        }
        if(cun == 0){
            D[j].index = m;
            D[j].value = v;
            j++;
        }
    }
    for(i = 0; i<j-1; i++){         //开始排序并输出
        for (m = i+1; m<j; m++) {
            if(D[i].index>D[m].index){
                temp = D[i];
                D[i] = D[m];
                D[m] = temp;
            }
        }
        printf("%d %d\n",D[i].index,D[i].value); 
    }
    printf("%d %d\n",D[i].index,D[i].value); 

    return 0;
}

编辑于 2023-12-01 21:48:32 回复(0)
#include <stdio.h>

int main() {
    long index, value, str[500][500]={0}, num[500][500]={0};
    int i, j, n;

    scanf("%d ",&n);
    i=0;
    while(i<n)
    {
        scanf("%ld %ld", &str[i][0], &str[i][1]);
        i++;
    }
    int count=0;
    for(i=0;i<n;i++)             //合并
    {
        for(j=0;j<count;j++)
        {
            if(str[i][0]==num[j][0])
            {
                num[j][1]+=str[i][1];
                break;
            }
        }
        if(j==count)             //index值首次出现直接赋值
        {
            num[count][0]=str[i][0];
            num[count][1]=str[i][1];
            count++;
        }
    }
    for(i=0;i<count;i++)               //排序
    {
        for(j=i+1;j<count;j++)
        {
            if(num[i][0]>num[j][0])
            {
                int temp0=num[i][0];
                int temp1=num[i][1];
                num[i][0]=num[j][0];
                num[i][1]=num[j][1];
                num[j][0]=temp0;
                num[j][1]=temp1;
            }
        }
    }
    for(i=0;i<count;i++)
    {
        printf("%ld %ld\n",num[i][0],num[i][1]);
    }
    return 0;
}

发表于 2023-11-30 18:50:42 回复(0)
// 数组指针法+动态分配内存,通用性更好,适用不用编译环境
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int n;   // 键值对个数
    int (*p_sheet)[2];  // p_sheet: 二维数组指针
    int temp[2] = {0};
    int index,value,i,j;
   
    while (scanf("%d", &n) != EOF)
    {
        p_sheet = (int(*)[2])malloc(n*sizeof(int)*2);
        memset(p_sheet,0,n*sizeof(int)*2);
       
        // 存储与合并
        for (i = 0;i < n;i++)
        {
            scanf("%d %d",&index,&value);

            for (j = 0;j < n;j++)
            {
                if (p_sheet[j][0] == 0 && p_sheet[j][1] == 0)
                {
                    p_sheet[j][0] = index;
                    p_sheet[j][1] = value;
                    break;
                }
                else
                {
                    if (p_sheet[j][0] == index)
                    {
                        p_sheet[j][1] = p_sheet[j][1] + value;
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
            }
        }

        // 排序
        for (i = 0;i < n && p_sheet[i][1] > 0;i++)
        {
            for (j = i + 1;j < n && p_sheet[j][1] > 0;j++)
                {
                    if (p_sheet[j][0] < p_sheet[i][0])
                    {
                        memcpy(temp, p_sheet[i], sizeof(int)*2);
                        memcpy(p_sheet[i],p_sheet[j],sizeof(int)*2);
                        memcpy(p_sheet[j],temp,sizeof(int)*2);
                    }
                }  
        }

        // 输出打印
        for (i = 0;i < n && p_sheet[i][1] > 0;i++)
        {
            printf("%d %d\n",p_sheet[i][0],p_sheet[i][1]);
        }

        // 释放内存
        free(p_sheet);
    }

    return 0;
}



发表于 2023-10-22 22:07:54 回复(0)
新手,最笨的方法
#include <stdio.h>

int main() {
    int num[1000][2] = {{0}};
    int n,l=0;
    int res[1000][2] = {{0}};
    int found = 0;
    scanf("%d",&n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d %d",&num[i][0],&num[i][1]);
    }
    for (int i = 0; i < n; i++)
    {
        found = 0;
        for (int j = 0; j <l; j++)
        {
            if (res[j][0]==num[i][0])
            {
                found = 1;
                res[j][1] += num[i][1];
                break;
            }                
        }

        if (found == 0)
        {
            res[l][0] = num[i][0];
            res[l][1] = num[i][1];
            l++;
        }

    }
    int cp[1][2] = {{0}};
    for (int i=0; i<l;i++) {
        for (int j=i; j<l; j++) {
            if (res[i][0]>res[j][0]) {
                cp[0][0]=res[i][0];
                cp[0][1]=res[i][1];
                res[i][0]=res[j][0];
                res[i][1]=res[j][1];
                res[j][0]=cp[0][0];
                res[j][1]=cp[0][1];
            }
        }
    }
for (int i = 0; i < l; i++)
{
    printf("%d %d\n",res[i][0],res[i][1]);
}  
    return 0;
}

发表于 2023-09-04 19:17:31 回复(0)
/*HJ8 合并表记录
当使用索引做一维数组下标时,会占用大量内存,可使用二维数组保存索引及数值,每一行中,第一列保存索引,第二列保存数值,然后将相同索引的行进行合并,每合并一行,将该行之后的行往前移位,总行数减一,最后将数组按索引遍历排序,升序输出*/
#include<stdio.h>
int main()
{
//输入
    int a[500][2],n,i,j,k,tmp[2];
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d %d",a[i]+0,a[i]+1);

//合并
    for(i=0;i<n;i++)
        for(j=i+1;j<n;j++)
        {
            if(a[j][0]==a[i][0])
            {
                a[i][1]+=a[j][1];
            for(k=j;k<n;k++)
                {
                    a[k][0]=a[k+1][0];
                    a[k][1]=a[k+1][1];
                }
                n--;
                j--;
            }
        }
   
//升序排序
    for(i=0;i<n;i++)
        for(j=i+1;j<n;j++)
    {
        if(a[i][0]>a[j][0])
            {
                tmp[0]=a[i][0];
                tmp[1]=a[i][1];
                a[i][0]=a[j][0];
                a[i][1]=a[j][1];
                a[j][0]=tmp[0];
                a[j][1]=tmp[1];
            }
    }

//输出
    for(i=0;i<n;i++)
    printf("%d %d\n",a[i][0],a[i][1]);
    return 0;
}
发表于 2023-07-26 22:52:31 回复(0)
#include <stdio.h>
#include <stdbool.h>
//index和value用结构体存放
typedef struct record{
    int ndx;
    int val;
}record;
//冒泡排序
void Sort(record *L, int n){
    int i, j;
    for(i=0; i<n-1; i++){
        bool flag = false;
        for(j=n-1; j>i; j--)
            if(L[j-1].ndx > L[j].ndx){
                /*swap*/
                record temp = L[j-1];
                L[j-1] = L[j];
                L[j] = temp;
                flag = true;
            }
        if(flag == false) break;
    }
}
int main(){
    /*输入n*/
    int n;
    scanf("%d", &n);
    /*循环n次,输入数据*/
    record L[n];
    int i;
    for(i=0; i<n; i++)
        scanf("%d %d", &L[i].ndx, &L[i].val);
    /*排序*/
    Sort(L, n);
    /*遍历,如果下一格index等于当前,累加*/
    int sum = 0;
    for(i=0; i<n; i++){
        if(L[i+1].ndx == L[i].ndx && i+1 < n)
            sum += L[i].val;
        else{
            sum += L[i].val;
            printf("%d %d\n", L[i].ndx, sum);
            sum = 0;
        }
    }
    return 0;
}


发表于 2023-07-12 23:05:32 回复(0)

问题信息

难度:
73条回答 104122浏览

热门推荐

通过挑战的用户

查看代码