招行信用卡笔试编程题 — 考察树的节点个数C++

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

秋招,错过了很多笔试,正好做到了招行信用卡的笔试题,编程题以前好像遇到过类似的题目,当时没有解决,这次整理mark一下,还是比较典型的一类题目。

题目描述:

信用卡开展营销活动,持有我行信用卡客户推荐信用户办卡,开卡成功后获得积分。规定每个客户最多可推荐两个新用户,且每个用户只能被推荐一次,但允许连接效应,即客户A推荐了新用户B,推荐了新用户C,则客户C同时属于A和B的推荐列表,变成计算推荐新户数不小于n的客户列表。

输入描述:

第一行两个正整数m,n,第一个数表示原始推荐列表的个数m,第二个表示n的取值。其后m行每行以空格分隔的原始推荐列表,第一列为推荐人,后面两列为被推荐人,若只推荐一个,第三列为*代替,推荐人和被推荐人均以大写字母表示,不同字母代表不同人

输出描述:

在同一行输出符合条件的客户列表,无顺序要求,客户间以空格为间隔。若客户列表为空,输出None.

输入:

5 2
A B C
C F *
B D E
D G *
E H I

输出:

A B E

代码如下:

#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<set>
using namespace std;

typedef struct PointStruct
{
    string a;
    string b;
    int count = 0;
} val;

//采用递归方式找到每个用户的发展客户
//key为原始用户(推荐人)
//point为所有的推荐人列表构成的map
int findpath(string key, map<string, val>& point) 
{

    if (point.find(key) == point.end() || key == "*")
        return 0;
    int left = 0;
    int right = 0;
    if (point[key].a != "*")
        left = 1 + findpath(point[key].a, point);
    if (point[key].b != "*")
        right = 1 + findpath(point[key].b, point);

    return left + right;

}

int main()
{
    int n, m;
    cin >> n >> m;
    map<string, val> point;
    vector<string> vec;
    string key = "";
    while (n--)
    {
        val value;
        cin >> key >> value.a >> value.b;
        point.insert(pair<string, val>(key, value));
    }
    map<string, val>::iterator iter;

    for (iter = point.begin(); iter != point.end(); iter++)
    {

        int count = 0;
        count = findpath(iter->first, point);
        iter->second.count = count;

    }
    for (iter = point.begin(); iter != point.end(); iter++)
    {
        if (iter->second.count >= m)
            vec.push_back(iter->first);
    }
    int i = 0;
    for (i = 0; i < vec.size() - 1; i++)
        cout << vec[i] << " ";
    cout << vec[i];


    return 0;
}

猜你喜欢

转载自blog.csdn.net/u011718609/article/details/77972253