题解 | #合并表记录#
合并表记录
https://www.nowcoder.com/practice/de044e89123f4a7482bd2b214a685201
#include <stdio.h>
#include <stdlib.h>
//找到key在key_tab中的索引,如果找不到返回-1(-1表示这个key第一次出现)
int find_key_index(int key,int n,int *key_tab)
{
n--;
while(n >= 0)
{
if(key == *(key_tab+n))
{break;}
n--;
}
return n;
}
//冒泡排序,对key_tab和key_val同时进行升序排序
void sort(int n, int *key_tab, int *key_val)
{
int temp;
for (int a = 1; a <= n-1; a++)//外层循环是比较的轮数,数组内有10个数,那么就应该比较10-1=9轮
{
for (int b = 0; b <= n-1-a; b++)//内层循环比较的是当前一轮的比较次数,例如:第一轮比较9-1=8次,第二轮比较9-2=7次
{
if (key_tab[b] > key_tab[b + 1])//相邻两个数如果逆序,则交换位置
{
temp = key_val[b];
key_val[b] = key_val[b + 1];
key_val[b + 1] = temp;
temp = key_tab[b];
key_tab[b] = key_tab[b + 1];
key_tab[b + 1] = temp;
}
}
}
}
int main() {
//为了节省空间,使用malloc,用户指定数组大小
int *key_val = NULL;
int *key_tab = NULL;
int n=0,key=0,val=0;
int count = 0; //记录合并后,不同key的个数
int index = 0; //排序之前,用于key和val的索引
scanf("%d\n",&n);
// printf("%d",n);
key_val=(int*)malloc(sizeof(int)*n); //数组默认初始化赋值0
key_tab=(int*)malloc(sizeof(int)*n); //数组默认初始化赋值0
for(int x=0;x<n;x++)
{key_tab[x] = -1;} //初始为-1,表示key还没有存入key_tab中
//下面的while进行了hash的映射
//最终效果:key_tab和key_val使用相同的数组下标,0到count
while(scanf("%d %d",&key,&val) != EOF)
{
// printf("key = %d, val = %d\n", key, val); //测试key和val是否被正确scanf
index = find_key_index(key, n, key_tab);
// printf("index = %d\n", index); //测试索引返回是否正确,key第一次出现返回-1
if(index == -1)
{
key_val[count] = val;
*(key_tab+count) = key;
// printf("key = %d\n",*(key_tab+i)); //测试key是否被正确存入key_tab中
count++;
}
else {
key_val[index] += val; //索引出现两次及以上
}
}
//按照key的顺序也就是key_tab进行排序,key_val同时进行排序
sort(count,key_tab,key_val);
for(int j=0;j<count;j++)
{
printf("%d %d\n",key_tab[j],key_val[j]);
}
return 0;
}
查看7道真题和解析