题目描述 :
给定一组部门信息存在departsMents , departsMents[i] 表示 cityName 部门所在城市,departName 部门名称, personNum部门人数
- 先从每个城市选取人数最多的5个部门作为分析对象,当人数相等时优先选取departName 字典序最小的; 不足5个按实际选;
- 然后对选取的结果,按照 cityName departName 逐行输出 首先按cityName 字典升序,同一个·城市,按departName字典升序输出;
解题思路:
定义结构体
部门结构体: 部门名字 部门人数
城市结构包含: 城市名字 部门结构体 部门数目;
step1: 创建临时结构体数组存放选出的城市和部门信息
step2: 对上面结构体 对部门信息按人数 部门名称排;
step3: 申请返回空间 放进去选好的输出形式数据;
step4: 对输出结果先排城市名 再排部门名
#define MAX_LEN 10
#define MAX_NUM 100
typedef struct {char departName[MAX_LEN];int personNum;
}DepartInfo;typedef struct {char cityName[MAX_LEN];DepartInfo departInfo[MAX_NUM];int departNum;
}CityInfo;typedef struct {char* departName;char* cityName;int personNum;
}DepartMnent;typedef struct {char* departName;char* cityName;
}DepartOut;// 对部门人数和部门名称排序
int cmp1(const void* a, const void* b)
{DepartOut* pa = (DepartOut*)a;DepartOut* pb = (DepartOut*)b;if (strcmp(pa->cityName, pb->cityName) == 0) {return strcmp(pa->departName, pb->departName);}return strcmp(pa->cityName, pb->cityName);
}int cmp2(const void* a, const void* b)
{DepartInfo* pa = (DepartInfo*)a;DepartInfo* pb = (DepartInfo*)b;if (pa->personNum == pb->personNum) {return strcmp(pa->departName, pb->departName);}return pb->personNum - pa->personNum;
}DepartOut* filter(DepartMnent* departsMents, size_t departsMentsSize, DepartOut* outPut)
{CityInfo info2[MAX_NUM];for (int i = 0; i < departsMentsSize; i++) {info2[i].departNum = 0;for (int j = 0; j < MAX_NUM; j++) {info2[i].departInfo[j].personNum = 0;}}int cityNum = 0;int flag; // 城市标记for (int i = 0; i < departsMentsSize; i++) {flag = 0;// 遍历城市for (int j = 0; j < cityNum; j++) {if (strcmp(departsMents[i].cityName, info2[j].cityName) == 0) {// 1. 添加已经存在城市的部门信息strcpy_s(info2[j].departInfo[info2[j].departNum].departName, MAX_LEN, departsMents[i].departName);info2[j].departInfo[info2[j].departNum].personNum = departsMents[i].personNum;info2[j].departNum += 1;flag = 1;break;}}// 2. 添加新城市 if (flag == 0) {strcpy_s(info2[cityNum].cityName, MAX_LEN, departsMents[i].cityName);// 添加部门strcpy_s(info2[cityNum].departInfo[info2[cityNum].departNum].departName, MAX_LEN, departsMents[i].departName);// 部门人数++ info2[cityNum].departInfo[info2[cityNum].departNum].personNum += 1;// 部门数++;info2[cityNum].departNum += 1;cityNum++;}}// 对部门信息按人数排 部门名称排for (int i = 0; i < cityNum; i++) {qsort(info2[i].departInfo, info2[i].departNum, sizeof(DepartInfo), cmp1);if (info2[i].departNum > 5) {info2[i].departNum = 5;}}// 将排好序的填进申请空间// 返回的形式是城市 和 部门 外层申请大的 内层分别申请城市名字和 部门名字DepartOut* departOut = (DepartOut*)malloc(sizeof(DepartOut) * cityNum);for (int i = 0; i < cityNum; i++) {// 每个城市对应几个部门 再申请部门的空间for (int j = 0; j < info2[i].departNum; j++) {departOut[i].cityName = (char*)malloc(sizeof(char) * MAX_LEN);departOut[i].departName = (char*)malloc(sizeof(char) * MAX_LEN);strcpy_s(departOut[i].cityName, MAX_LEN, info2[i].cityName);strcpy_s(departOut[i].departName, MAX_LEN, info2[i].departInfo[j].departName);}}// 第二个排序 先排城市名 再排部门qsort(departOut, cityNum, sizeof(DepartOut), cmp2);return departOut;
}