阿里巴巴2020算法实习生笔试题目及解法

题目描述:
从n个人中选出一部分人,然后,在这一部分人中选一个队长,共有多少种选法?

其实就是一个排列组合的问题,组合各种可能,然后在组合好的人选里选择一个数。

num =  int(input())

b =[]
a =''
for n in range(1,num+1):
    b.append(n)
for i in b:
    a += ''.join(str(i))

import itertools

list1 = a
list2 =[]
for i in range(1,len(list1)+1):
    iter = itertools.combinations(list1,i)
    list2.append(list(iter))

count =0
for j in list2:
    for k in j:
        print(j)
        count +=len(k)*1
        print(k)

print(count)

方法二

def getBinaryRep(n, numDigits):
    """假设n和numDigits为非负整数
    返回一个长度为numDigits的字符串,为n的二进制表示"""
    result = ''
    while n > 0:
        result = str(n%2) + result
        n = n//2
    # if len(result) > numDigits:
    #     raise ValueError('not enough digits')
    for i in range(numDigits - len(result)):
        result = '0' + result
    return result

print(getBinaryRep(6,4))

def genPowerset(L):
    """假设L是列表返回一个列表,包含L中元素所有可能的集合。例如,
    如果L=[1, 2],则返回的列表包含元素[1]、[2]和[1,2]"""
    powerset = []
    for i in range(1, 2**len(L)):
        binStr = getBinaryRep(i, len(L))
        subset = []
        for j in range(len(L)):
            if binStr[j] == '1':
                subset.append(L[j])
        powerset.append(subset)
    return powerset

L = [1,2,3]
A= genPowerset(L)
count = 0
for i in A:
    count += len(i)
print(count)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值