【华为机试】2023年真题B卷(python)-猜密码

一、题目

题目描述:

小杨申请了一个保密柜,但是他忘记了密码。只记得密码都是数字,而且所有数字都是不重复的。
请你根据他记住的数字范围和密码的最小数字数量,帮他算下有哪些可能的组合,规则如下:

1、输出的组合都是从可选的数字范围中选取的,且不能重复;

2、输出的密码数字要按照从小到大的顺序排列,密码组合需要按照字母顺序,从小到大的顺序排序。

3、输出的每一个组合的数字的数量要大于等于密码最小数字数量;

4、如果可能的组合为空,则返回“None”

二、输入输出

输入描述:
1、输入的第一行是可能的密码数字列表,数字间以半角逗号分隔 2、输入的第二行是密码最小数字数量
输出描述:
可能的密码组合,每种组合显示成一行,每个组合内部的数字以半角逗号分隔,从小到大的顺序排列。 输出的组合间需要按照字典序排序。 比如: 2,3,4放到2,4的前面

三、示例

示例1   

输入输出示例仅供调试,后台判题数据一般不包含示例
输入
2,3,4
2
输出
2,3
2,3,4
2,4
3,4
说明:最小密码数量是两个,可能有三种组合: 2,3 2,4 3,4
三个密码有一种: 2,3,4

四、参考代码 


# -*- coding: utf-8 -*-
'''
#coding: utf-8
Author: mgc
Date: 2023-12-17 12:44:53
LastEditors: Do not edit
LastEditTime: 2023-12-19 15:47:03
'''
 
# import os
# import sys
# import math
# import functools
# import collections



# 从输入中获取数字列表
nums = [int(x) for x in input().split(',')]

# 获取k的值
k = int(input())

# 对nums进行去重并排序
nums = sorted(list(set(nums)))

# 用于记录已访问过的结果
visited = {}

# 用于存储最终结果
res = []

def dfs(pos, cur): 

    global nums 
    global k

    # 如果当前结果的长度达到了k,将其加入最终结果列表
    if len(cur) >= k:
        ans = ','.join(cur)
        if visited.get(ans) is None:
            res.append(ans)
            visited[ans] = True

    # 如果已经遍历到了nums的末尾,结束当前搜索
    if pos >= len(nums):
        return

    # 将当前位置的数字加入结果中,继续搜索
    cur.append(str(nums[pos]))
    dfs(pos + 1, cur)

    # 回溯,将当前位置的数字从结果中移除,继续搜索
    cur.pop()
    dfs(pos + 1, cur)
    
# 从位置0开始进行深度优先搜索
dfs(0, [])

# 输出结果
if len(res) == 0: 
    print('None') 
else: 
    res = sorted(res) 
    print('\n'.join(res))

你可能感兴趣的:(华为机试,华为,python,算法,华为机试,猜密码)