一种常规的解体思路,可以避免题目出得不周全而出现的bug
题目描述
数据表记录包含表索引和数值(int范围的整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
输入描述:
先输入键值对的个数
然后输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
示例1
输入:
4
0 1
0 2
1 2
3 4
输出:
0 3
1 2
3 4
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct tab
{
int index;
int value;
};
int main(void)
{
int i,j,tab_num, k;
struct tab tmp, *p;
//输入的数据量
scanf("%d",&tab_num);
//存放输入数据
p = malloc(sizeof(struct tab) * tab_num);
if(!p)
{
printf("没有足够的内存使用");
return -1;
}
//记录输入数据并合并相同的索引
for(i = 0,k = 0; i < tab_num; i++)
{
scanf("%d%d", &tmp.index, &tmp.value);
if (i == 0)
{
p[0].value = tmp.value;
p[0].index = tmp.index;
k++;
}
else
{
for(j = 0; j < k; j++)
{
if(p[j].index == tmp.index)
{
//相同的索引合并
p[j].value += tmp.value;
break;
}
}
if(j >= k)
{
//不同的添加的后面
p[k].value = tmp.value;
p[k].index = tmp.index;
k++; //记录使用的结构体数组的下标
}
}
}
//排序
for(i = 0; i < k; i ++)
{
tmp = p[i];
for(j = i + 1; j < k; j++)
{
if( p[j].index < p[i].index)
{
//只要比i位置的小,则进行交换
tmp = p[j];
p[j] = p[i];
p[i] = tmp;
}
}
}
//输出
for(i = 0; i < k; i++)
{
printf("%d %d\n",p[i].index, p[i].value);
}
//用完释放申请的内存
free(p);
return 0;
}
京公网安备 11010502036488号