题目:
现在信用卡开展营销活动,持有我行信用卡客户推荐新户办卡,开卡成功后可获得积分奖励。规定每个客户最多可推荐两个新户且一个新户只能被推荐一次。但允许链接效应,即若客户A推荐了新户B,新户B推荐新户C,则客户C同时属于A和B的推荐列表。简单起见,只考虑以一个老客户A作起点推荐的情况。编程计算推荐新户数不小于n的客户列表。

输入示例:
5 2
A B C
C F *
B D E
D G *
E H I

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

输出示例:
A B E

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

题目理解:
重点:链接效应——决定深度搜索的树结构
即:在以一个老客户A作为起点的推荐情况建立一棵二叉树,求这棵二叉树上左右两个树枝上数量不小于n的所有结点

解题步骤:

  1. 建图
  2. 深度优先搜索

代码:

## 1. 初始化
m,n = map(int,input().split(" "))
#input()取到第一行输入,int把str转换成int;
#map用于多参数多返回值的函数计算,
#例如:res1,res2 = map(func(),输入参数)#树中所有成员的初始字典——key为输入值, value为对应的树结点对象,提前告诉编译器‘*’值的结点对象为None,否则*.val=*
mem = {"*":None} #这里使用字典是为了把每个输入与结点对象对应
degree = set()#除了根节点以外的所有结点的集合
# 目的:最后用mem-degree就可以知道谁是根节点,用集合存储可以自动去重## 2.构建二叉树图:把所有输入变成结点对象,并让每个结点知道自己的左右孩子
#2.1 定义结点类
class ListNode:def __init__(self,x):#初始一个结点对象的值是它自身,左右结点都为空self.val = xself.left = Noneself.right = None#2.2 把字符输入变成结点对象
# 循环m次(有m个推荐表,_为占位符)
for _ in range(m):root,left,right = input().split() #每人推荐的两个人分别为左右孩子(这里仅为定义变量名,还未起到实质作用)#把字符输入变成结点对象if root not in mem: mem[root] = ListNode(root)if left not in mem:mem[left] = ListNode(left)if right not in mem:mem[right] = ListNode(right)#  把新的成员结点加入到集合中(自动去重)degree.add(left)degree.add(right)# 2.3 把父节点和子节点真正地串联起来_root,_left,_right = mem[root],mem[left],mem[right]_root.left = _left_root.right = _right
#注:树的结构是保存在每个结点的结点对象里的,即让每个结点找到他们的左右结点# 2.4 找到树的根节点
#root 节点是入度为0的节点
root = (set(mem) - degree).pop() #用pop()取得集合中的元素,否则取到的是有一个对象的集合# 3. 查找——DFS
#建立用来存储结果的全局变量
global ans
ans = []#DFS查找函数,查找到符合条件的结果放入全局变量ans中
#DFS,常规操作
def dfs(root):global ans # 记住全局变量也需要在函数中再声明一遍,不然访问不到if root: # 如果结点不为空,找他们的左右孩子left = dfs(root.left) #得到左边分支上结点个数right = dfs(root.right) #得到右边分支上结点的个数this = left + right + 1  #这个位置结点的数量需要加上它自身(1),否则对于它的上一层结点来说,就会少掉1个结点的数量if this >= n + 1:  # 因为这里算推荐新客户的数量不小于n,需要减掉推荐人自身,即this-1>=nans.append(root.val) #推荐新客户数量不少于2时加入到结果列表中return this # 返回当前结点的左右分支结点数再加上它自己一个,给他的父节点return 0 # 如果结点为空,返回该位置结点的数量为0#调用查找函数计算结果,传入之前建图后找到的根节点开始
dfs(mem[root])
if ans: #如果结果不为空print(" ".join(ans)) #按格式输出
else: # 否则
#None也要print出来,不然会少一个回车符print(None)

这里画出树的搜索路径

【招商银行数据方向笔试题】—— 信用卡推荐客户列表相关推荐

  1. 招行数据岗笔试题- 信用卡推荐客户列表

    空间限制:32768K 现在信用卡开展营销活动,持有我行信用卡客户推荐新户办卡,开卡成功后可获得积分奖励.规定每个客户最多可推荐两个新户且一个新户只能被推荐一次.但允许链接效应,即若客户A推荐了新户B ...

  2. 2018今日头条大数据方向笔试题

    题目链接 一.一道繁琐的大模拟 N个产品经理,M个程序员,P个需求.N个产品经理向M个程序员提出P个需求. 每个需求用四元组表示:产品经理ID(谁提出的) 提出时间 优先级(数字越大优先级越高) 需求 ...

  3. 招商银行信用卡中心2018秋招数据方向笔试题

    信用卡推荐客户列表 现在信用卡开展营销活动,持有我行信用卡客户推荐新户办卡,开卡成功后可获得积分奖励.规定每个客户最多可推荐两个新户且一个新户只能被推荐一次.但允许链接效应,即若客户A推荐了新户B,新 ...

  4. 2018清华-伯克利深圳学院数据科学方向笔试题

    2018清华-伯克利深圳学院数据科学方向笔试题

  5. 盘点数据分析师笔试题 你会做几道?

    上次,我们给大家讲述了一些数据分析师面试的必备技巧,本期我们主要给大家盘点数据分析师笔试题(当然,即便是笔试用不到,面试也可以用得到哈),希望当遇到这类典型题目时,大家可以轻松应对. 盘点数据分析师笔 ...

  6. 爱奇艺2019秋招Java方向笔试题(B)

    爱奇艺2019秋招Java方向笔试题(B) 1. 已知一个由5个顶点8条边构成的有向图,以下说法正确的是( C ) A. 各顶点的度之和为8 B. 若以邻接表作为存储结构,邻接表中结点个数为16 C. ...

  7. 百度2019校招计算机视觉方向笔试题

    百度2019校招计算机视觉方向笔试题 第一题:K-means聚类 第二题:相机模型 第三题:自动驾驶 第四题:目标检测 第一题:K-means聚类 关于K-means聚类算法,请回答以下问题: K-m ...

  8. 阿里巴巴java方向笔试题 带详细答案

    阿里巴巴java方向笔试题 带详细答案 1,下列说法正确的是() A.一个文件里可以同时存在两个public修饰的类 B.构造函数可以被重写(override) C.子类不能访问父类非public和p ...

  9. 阿里巴巴java方向笔试题(出自牛客网)

    阿里巴巴java方向笔试题 1.以下程序输出结果是____ class A {public:A ():m_iVal(0){test();}virtual void func() { std::cout ...

最新文章

  1. server+client+http,服务器与客户端的交互
  2. IMAX融资5000万美元,三年内要打造25个VR项目
  3. Windows Live Windows Phone 7
  4. ycsb两个阶段说明
  5. 怎么安装python_零基础入门必看篇:浅析python,PyCharm,Anaconda三者之间关系
  6. 使用jsonp及jquery的$.ajax解决跨域问题
  7. sketch钢笔工具_设计工具(Sketch,Adobe XD,Figma和InVision Studio)中奇怪的一项功能
  8. vijos1056-图形面积【离散化】
  9. MacBook 如何一次性关闭所有程序的通知消息
  10. 从一个字符串中删除另一个字符串中出现过的字符
  11. Atitit 知识体系概论 attilax著 三大类型 学术型 应用型 职业技术教育 1 附表1、CIP-2000学科群设置情况总表 1 三大层次 分类 学科 专业 2 20个知识大类 2 需
  12. oracle 10g rac安装
  13. python三大禁忌_Python2.7 和 Python3.5 是两个不同版本的 Python ,它们之间并不相互兼容。_学小易找答案...
  14. 支付宝 客户端 Android 集成流程
  15. Unity 材质设置为tiling不能够重复的问题
  16. 利用Python导入股票列表
  17. mysql更新表时自动生成时间和更新时间
  18. 苹果手机服务器找不到,电脑找不到苹果手机热点
  19. A later version of Node.js is already installed. Setup willnow exit.
  20. opencv之Mat的定义

热门文章

  1. 密码学应用-身份认证+数字证书
  2. 数据结构之树从入门到如土(四)----从零开始入门Rust实现一颗B树(未完成待续)
  3. 尚硅谷MySQL高级JAVA版
  4. 网络统考计算机应用基础ppt视频,计算机应用基础课程网络统考辅导.ppt
  5. CPU,GPU,NPU的架构差异对比
  6. linux点唱机安装教程,咪哒Minik移动ktv点唱机安装教程(文字版)
  7. 微信 for Windows 内测3.3.0版本,能刷朋友圈啦!
  8. power query连接mysql
  9. 初识EMC元器件(五)——电容参数解读及选型应用
  10. mpstat命令(linux cpu监控工具)