阿里巴巴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)

你可能感兴趣的:(刷题笔记)