华为机试题1

题目描述

数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。

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


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

输入例子:
4
0 1
0 2
1 2
3 4

输出例子:
0 3
1 2

3 4

解题要点:

1.打算用什么样的方式来存放表每一项的索引和键值,即选什么数据结构。数组、结构体(类)。


数组:

#include <iostream>
#include <vector>
using namespace std;
int main()
    {
    int index,value,num;
    int key_value[10000]={0};   //设置初值为0;  index作为数组的下标,value作为数组的值;
       //vector<int> key_value(10000,0);
    cin>>num;
    for(int i=0;i<num;i++)
        {
        cin>>index>>value;
        key_value[index]+=value;
    }
    for(int i=0;i<10000;i++)
        if(key_value[i]!=0)     当初值为0时,表名对应i无此index   这里只有当所有相同index的value之和不为0的情况才正确,这是此方法的一个限制;
             cout<<i<<" "<<key_value[i]<<endl;
    return 0;
}
</pre><pre name="code" class="cpp"><span style="font-size:24px;color:#3366ff;"><strong>类(结构体)</strong></span>

#include <iostream>

#include <vector>
using namespace std;
class key_value
    {
    public:
    int index;
    int value;
};
int main()
    {
    int num,i,j,k;
    cin>>num;
    key_value kv[num]; //类的对象是数组
    //输入
    for(i=0;i<num;i++)
        {
        cin>>kv[i].index>>kv[i].value;
    }
    //相同index的合并
    for( i=0;i<num-1;i++)
        for(j=i+1;j<num;j++)
      
        if(kv[i].index==kv[j].index)
         {
            kv[i].value+=kv[j].value;
            for(k=j;k<num-1;k++)          //删除数组中的一个元素操作,不用vector中的erase,总出毛病
            kv[k]=kv[k+1];  
            j--;   //注意此处;
            num--;
        }
 
    //将类(结构体)按index<span style="color:#ff0000;">排序:如果用二维数组,则在排序时,无法交换两个元素。</span>
    key_value temp;
    for(i=0;i<num-1;i++)
        for(j=0;j<num-1;j++)
        if(kv[j].index>kv[j+1].index)
        {
        temp=kv[j];
        kv[j]=kv[j+1];
        kv[j+1]=temp;     //可用swap()函数
    }
    //输出
    for(i=0;i<num;i++)
        cout<<kv[i].index<<" "<<kv[i].value<<endl;
    return 0;
}


 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值