阿里巴巴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的长度即为分组的组数

阅读全文
0 0
原创粉丝点击