[编程题]合并表记录

合并表记录

http://www.nowcoder.com/questionTerminal/de044e89123f4a7482bd2b214a685201

题目描述
数据表记录包含表索引和数值(int范围的整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。

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

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

示例1
输入:
4
0 1
0 2
1 2
3 4
输出:
0 3
1 2

3 4

C语言解法一:
#include "stdio.h"

typedef struct
{
    int index;
    int val;
}KeyVal;

int main()
{
    int n;

    while(scanf("%d", &n) != EOF) {
        KeyVal tmp[n], t;
        int i,j;

        for(i=0; i<n; i++)
            scanf("%d %d", &tmp[i].index, &tmp[i].val);

        for(i=0; i<n; i++) {
            for(j=i+1; j<n; j++) {
                if(tmp[i].index == tmp[j].index) {
                    tmp[i].val += tmp[j].val;
                    for(int k=j; k<n; k++)
                        tmp[k] = tmp[k+1];
                    j--;
                    n--;
                }
            }
        }

        for(i=0; i<n; i++) {
            for(j=i+1; j<n; j++) {
                if(tmp[i].index > tmp[j].index) {
                    t = tmp[i];
                    tmp[i] = tmp[j];
                    tmp[j] = t;
                }
            }
        }

        for(i=0; i<n; i++)
            printf("%d %d\n", tmp[i].index, tmp[i].val);
    }
}


解法二:
#include "stdio.h"
 
int main()
{
    int n;
 
    while(scanf("%d", &n) != EOF) {
        int a[1000]={0}, i, index, val;
 
        for(i=0; i<n; i++) {
            scanf("%d %d", &index, &val);
            a[index] += val;
        }
 
        for(i=0; i<1000; i++) {
            if(a[i])
                printf("%d %d\n", i, a[i]);
        }
    }
}




全部评论
解法二你怎么确定合并不是零呢,正确的解法应该用一个bool数组,表示数组是否为空
2 回复 分享
发布于 2020-06-13 21:54
是个好思路 奈何例子里有11111111
7 回复 分享
发布于 2021-09-29 17:22
解法二,如果输入的索引值超过1000呢
4 回复 分享
发布于 2020-05-24 14:34
解法一看上去是一堆垃圾
2 回复 分享
发布于 2020-02-27 18:04
哪怕你试一下所有的测试样例呢?数组的思路需要索引值足够小,不然会超出32m的限制。这道题1000数组显然是不行的
2 回复 分享
发布于 2022-02-05 16:53
索引的会越界,冒泡排序都用错了
1 回复 分享
发布于 2021-02-14 13:36
没有确定范围,没办法用桶排序
点赞 回复 分享
发布于 2020-07-21 12:13
for(int k=j; k
点赞 回复 分享
发布于 2022-08-31 22:17 贵州
解法一,第24行应为for(int k = j; k < n-1; k++) k < n 会造成第25行 tmp[k] = tmp[k+1]; 在边界情况时 :tmp[n-1] = tmp[n]; 而tmp[n]属于数组越界。 正确边界应为 tmp[n-2] = tmp[n-1] //将倒数第一个前移至倒数第二个
点赞 回复 分享
发布于 2023-04-09 13:01 山西

相关推荐

2024-12-23 10:55
已编辑
大连理工大学 Java
牛客930504082号:华子综测不好好填会挂的,而且填的时候要偏向牛马选项
点赞 评论 收藏
分享
评论
48
2
分享

创作者周榜

更多
正在热议
更多
# 听劝,这个简历怎么改 #
14099次浏览 183人参与
# 面试被问“你的缺点是什么?”怎么答 #
6405次浏览 99人参与
# 水滴春招 #
16463次浏览 349人参与
# 入职第四天,心情怎么样 #
11321次浏览 63人参与
# 租房找室友 #
8027次浏览 53人参与
# 读研or工作,哪个性价比更高? #
26163次浏览 356人参与
# 职场新人生存指南 #
199236次浏览 5510人参与
# 参加完秋招的机械人,还参加春招吗? #
27000次浏览 276人参与
# 文科生还参加今年的春招吗 #
4114次浏览 31人参与
# 简历无回复,你会继续海投还是优化再投? #
48629次浏览 561人参与
# 你见过最离谱的招聘要求是什么? #
144719次浏览 829人参与
# 如果重来一次你还会读研吗 #
155719次浏览 1706人参与
# 机械人选offer,最看重什么? #
69077次浏览 449人参与
# 选择和努力,哪个更重要? #
44310次浏览 493人参与
# 如果再来一次,你还会学硬件吗 #
103647次浏览 1245人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
20521次浏览 414人参与
# 招聘要求与实际实习内容不符怎么办 #
46753次浏览 494人参与
# 22届毕业,是读研还是拿外包offer先苟着 #
4652次浏览 27人参与
# 你们的毕业论文什么进度了 #
901248次浏览 8961人参与
# 软开人,你觉得应届生多少薪资才算合理? #
81379次浏览 496人参与
# 国企还是互联网,你怎么选? #
109191次浏览 853人参与
牛客网
牛客企业服务