中兴2018秋招-员工工资清单频次排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zh1204190329/article/details/82590009

某公司有N名员工,给定所有员工工资的清单,财务人员要按照特定的顺序排列员工的工资。他按照工资的频次降序排列,即给定清单中所有频次较高的工资在频次较低的工资之前出现。如果相同数量相同的员工有相同的工资,则将按照给定清单中该工资第一次出现的顺序排列。
写一个算法帮助财务人员排列员工工资的顺序。
这里写图片描述

这里写图片描述

#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <string.h>
#include <stack>

using namespace std;

typedef struct _CntOrder {
    int count;    // 工资出现的次数
    int order;    // 工资出现的顺序
} CntOrder;

typedef pair<int, CntOrder> PAIR;

bool cmp(const PAIR& lhs, const PAIR& rhs) {
    if (lhs.second.count != rhs.second.count)
        return lhs.second.count > rhs.second.count;
    //else if (lhs.second.count == rhs.second.count)
    else
        return lhs.second.order < rhs.second.order;
}

int main() {
    int num;
    cin >> num;
    int money;
    map<int, CntOrder> salarylist;  // 工资列表

    /*
     * test case
     * 24
     10000 20000 40000 30000 30000 70000 70000 70000
     30000 40000 20000 50000 50000 50000 50000 60000
     60000 40000 40000 60000 70000 80000 90000 100000
     *
     * */
    for (int i = 0; i < num; i++) {
        cin >> money;
        ++salarylist[money].count;
        if (salarylist[money].order == 0)
            salarylist[money].order = i;
    }

    vector<PAIR> salaryinput(salarylist.begin(), salarylist.end()); // 把map数据存入vector中

    sort(salaryinput.begin(), salaryinput.end(), cmp);

    cout << "[";
    for (int i = 0; i != salaryinput.size() - 1; ++i) {
        for (int j = 0; j < salaryinput[i].second.count; j++)
            cout << salaryinput[i].first << ", ";
    }

    for (int j = 0; j < salaryinput[salaryinput.size() - 1].second.count - 1;
            j++)
        cout << salaryinput[salaryinput.size() - 1].first << ", ";

    if (salaryinput[salaryinput.size() - 1].second.count)
        cout << salaryinput[salaryinput.size() - 1].first;

    cout << "]";

    return 0;
}

输出:
[40000, 40000, 40000, 40000, 70000, 70000, 70000, 70000, 50000, 50000, 50000, 50000, 30000, 30000, 30000, 60000, 60000, 60000, 20000, 20000, 10000, 80000, 90000, 100000]
这里写图片描述

猜你喜欢

转载自blog.csdn.net/zh1204190329/article/details/82590009
今日推荐