题解 | #合并表记录#

合并表记录

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;
}

全部评论

相关推荐

小灰呵呵呵:网签还是纸质三方啊
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务