【贝壳笔试】算法岗-丢失的卡片-第二题求大佬点拨

我的思路是求1-n之间的每个可能的数字list与输入的做比较,如果小于则继续加,大于说明遇到可能的候选,跳出比较,求出缺少的每个数字,然后求全排列。
但是只能过10%,求大佬点拨
def listSum(nums):
    # 将list映射为一个各个数字出现的总和
    sum = 0
    for i in range(1,11):
        sum += i*nums[i-1]
    return sum
def permute(nums):
    # 求list里数字全排列
    def dfs(nums, stack):
        if not nums:
            res.append(stack)
        for i ,num in enumerate(nums):
            dfs(nums[:i]+nums[i+1:],stack+[num])
    res = []
    dfs(nums,[])
    return res

if __name__ == '__main__':
    T = input()
    inputNums = list(map(int,(T).split(' ')))
    candidateNums = []
    # 初始化
    for i in range(0,10):
        candidateNums.append(0)
    num = 1
    while(True):
        n = num
        while(num!=0):
            remainder = num%10
            candidateNums[remainder] += 1
            num = num//10
        candidateSum = listSum(candidateNums)
        inputSum = listSum(inputNums)
        if candidateSum < inputSum:
            num  = n+1
        else:
            break
    numCandidates = []
    for i in range(0,10):
        if(candidateNums[i] != inputNums[i]):
            numCandidates.append(i)
    resultCandidates = permute(numCandidates)
    result = []
    for i in resultCandidates:
        strCandidate = ""
        for j in i:
            strCandidate += str(j)
        result.append(strCandidate)
    sorted(result)
    if len(result) == 0:
        print("NO ANSWER")
    else:
        for i in result:
            print(n,int(i))


#贝壳找房##笔试题目##题解##秋招#
全部评论
用一个数组记录每个数字出现的个数,当数组里面的个数全部大于等于题给时停下来,计算题给个数和计算所得少了多少,求少的和,如果少的个数小于当前计算的最高位数(比如少了1和0,总共少了3个,目前计算得到的最高位是4位,比如算到1245时候,数组里的个数都大于题给了),说明是可能的,缺省卡值就是少的这几个数排列组合,大了其实说明不可能,不可能缺一张卡,里面数字个数还大于最高位数,你应该没有计算少了多少个
点赞 回复 分享
发布于 2019-08-11 15:30
和我的思路一模一样,可惜我的好像有点bug,一直超时,连10都没有😂
点赞 回复 分享
发布于 2019-08-11 09:10
大佬第四题有ac吗?求解答
点赞 回复 分享
发布于 2019-08-10 23:50
第一题什么思路兄弟
点赞 回复 分享
发布于 2019-08-10 23:41
插个眼
点赞 回复 分享
发布于 2019-08-10 23:37

相关推荐

03-30 19:30
石家庄学院 Java
野蛮的柯基在游泳:都能入股了,还得是Java
点赞 评论 收藏
分享
评论
3
6
分享

创作者周榜

更多
牛客网
牛客企业服务