阿里巴巴2017年秋招(测试开发工程师)编程题:组队问题
来源:互联网 发布:网络大学 日语专业 编辑:程序博客网 时间:2024/06/08 17:01
朋友(直接朋友和间接朋友)组队问题
第一个人a与第二个b是朋友,值表示为M[0][1]=1
第一个人a与自身是朋友,值表示为M[0][0]=1
第一个人a与第三个人c不是朋友,值表示M[0][2]=0
若第二个人b与第四个人d是朋友,则值表示M[1][3]=1 因a和b、b和d是直接朋友,故a和d是间接朋友
直接朋友或间接朋友可以组队,没有朋友的单个人为一组,求可以分成几组
输入:
输入二维数组的行数 如6
输入二维数组的列数 (其实行数和列数是相同的,因为关系是一一对应的,并且二位数组是对称数组)
输入第一行人对应的关系 如1 1 0 0 0 0 #输入第二行人对应的关系 如1 1 0 0 0 0
输出:
#输出分组数:数字
例子1
[[1,1,0],[1,1,0],[0,0,1]] 输出:2例子2
[ [1,1,0,0,0,0], [1,1,0,0,0,0],
[0,0,1,0, 0,0], [0,0,0,1,0,0], [0,0,0,0,1,0], [0,0,0,1,0,1]]输出:4
python代码:
# -*-coding:utf-8 -*-#code=utf-8#code:utf-8import sysdef CaculatePeopleGroup(): res=0 data_row= input() #raw_input()输入二维数组的行数 data_col = input() #raw_input()输入二维数组的列数 dataList=[] ##[[1,1,0,0],[1,1,1,0],[0,1,0,1],[0,0,0,1]] resList=[] if(data_row==data_col): for i in xrange(data_row):#循环输入行数次 0,1,2,data_row-1停 data_i=list(sys.stdin.readline().strip().split()) #1,1,0,0 # 1 1 0 0 0 0 dataList.append(data_i) #如何输入1 1 0 0 0 0 #print ("value:%s data_i:%s" %(dataList,data_i)) stmList=[] for col in xrange(i,len(data_i)): #print("data_i[i]:%s data_i[col]):%s" % (data_i[i], data_i[col])) if(data_i[i]==data_i[col]) and (int(data_i[col])==1) : stmList.append(col+1) #得到和自己是朋友的有哪些人 #print("stmList:%s col:%s" %(stmList,col)) resList.append(stmList) #[[1,2],[2],[3],[4,6],[5],[6]] 第一个list表示1只与2是朋友,第二list表示2没有与2后面的人是朋友,第四个list表示4与后面的6是朋友 #print("resList:%s" % resList) else: print "Error:输入的数据不正确" delList=[] for i in xrange(len(resList)): #len(resList)为6 index为0 resList[index]为[1,2] #print ("reslist[i]:%s len(resList):%d resList:%s" %(resList[i],len(resList),resList)) for j in xrange(i+1,len(resList)):#循环resList[index]后面的值 #print ("reslist[j]:%s len(resList):%d resList:%s j:%s" % (resList[j], len(resList),resList,j)) for i_i in xrange(len(resList[i])): for j_j in xrange(len(resList[j])): #print("resList[%s][%s]:%s resList[%s][%s]):%s" % (i,i_i,resList[i][i_i],j,j_j, resList[j][j_j])) if(resList[i][i_i]==resList[j][j_j]): if(len(resList[j])>1): resList[i].append(resList[j]) #print resList[j] #打印有相同朋友 delList.append(resList[j]) #删除后面重复的数 break for del_i in delList: if(del_i in resList): #print del_i resList.remove(del_i) #print("resList222222222:%s" % resList) res=len(resList) return resif __name__ == "__main__": result=CaculatePeopleGroup() print str(result)+"\n"
解题思路:
1、获取第i个人与后面的人是否是朋友关系,有关系则append到stmList列表中如[1,2,4],表示第一个人与第二个人和第四个人都是朋友
2、resList列表为每一行stmList的人员关系集合如[[1,2],[2,5],[3],[4],[5],[6]]
3、首先循环len(resList)取得resList[i]的值如[1,2],
4、其次循环(i,len(resList))获取resList[i]后的每一个值resList[j]:[2,5],[3]等
5、循环取得resList[i]的每个值value_i
6、循环取得resList[j]的每个值 value_j,比较value_i与value_j是否相同,判断是否有相同的朋友,从而得出间接朋友,并将resList[j]添加在resList[i]的组内
7、resList[j]已经并入resList[i]组,故删除有相同朋友的resList[j]
8、resList的长度即为分组的组数
- 阿里巴巴2017年秋招(测试开发工程师)编程题:组队问题
- 测试开发工程师面试(阿里巴巴)
- 阿里巴巴集团2017暑期实习生在线编程测试题分析-Java研发工程师(二叉树求路径和)
- 2014 阿里巴巴 校招 测试开发工程师 笔试题
- 阿里巴巴集团2017暑期实习生在线编程测试题分析-Java研发工程师
- 阿里巴巴2014校园招聘【测试开发工程师】笔试题(北京站)/Linux面试
- 2016阿里巴巴校园招聘测试开发工程师笔试附加题(含部分答案)
- 【测试开发工程师】阿里巴巴集团面试经历
- 阿里巴巴 测试开发工程师 校招经历
- 阿里巴巴测试开发工程师面试记录
- 2017阿里巴巴算法工程师在线测试
- 2017 实习生 阿里巴巴 java开发工程师笔试题 字符串匹配
- 阿里巴巴2017暑期实习生-算法工程师(机器学习)编程测验题
- 2013年阿里巴巴实习生招聘测试开发工程师一面
- 2018校招-阿里巴巴测试开发工程师面试经验
- 兔子繁衍问题求解(阿里巴巴2017在线编程题)
- 关于阿里巴巴测试工程师招聘
- 阿里巴巴面试总结:测试工程师
- node.js中的exports
- Spring Boot 启动流程详解(二)
- rtsp协议总结
- Oracle内存全面分析 2
- RAID、LVM(逻辑卷)的相关用法
- 阿里巴巴2017年秋招(测试开发工程师)编程题:组队问题
- [欧拉路] Codeforces Round #407 (Div. 1) 788B. Weird journey
- c++容器迭代器失效问题
- .NET Core 2.0迁移技巧之MemoryCache问题修复
- Oracle内存全面分析 3
- CodeForces 788B 浅谈并查集维护奇妙欧拉回路
- AT24C02之典型电流参数
- Oracle内存全面分析 4
- 多线程mutex_lock的使用