阿里巴巴2017年秋招(测试开发工程师)编程题:组队问题

朋友(直接朋友和间接朋友)组队问题
第一个人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-8
import sys
def 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 res

if __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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值