返回

420. 强密码检验器: 事半功倍,轻松解决!

后端





## 强密码检验器:事半功倍,轻松解决!

作为一名技术人员,我们经常需要处理各种密码,无论是工作还是生活中,密码的安全性和强度都至关重要。如何创建一个既安全又好记的密码呢?今天,我们就来聊聊LeetCode上的420. 强密码检验器。

题目

> 给你一个整数 n,请你设计并实现一个满足如下要求的密码检验器:

> 1. 密码必须至少包含一个大写字母、一个小写字母、一个数字和一个特殊符号(请参阅附表)。
2. 密码必须至少包含 n 个字符。

> 附表:

| 符号 | 示例字符 |
|---|---|
| 数字 | 0-9 |
| 小写字母 | a-z |
| 大写字母 | A-Z |
| 特殊符号 | !@#$%^&*()-+ |

> 输入:n = 4
输出:
```cpp
[
  "Aa1!",
  "1337!",
  "aF1!",
  "123a!",
  "abc1!"
]

解决方案

这道题的解题思路很简单,我们可以使用模拟的方法,枚举出所有满足条件的密码。为了提高效率,我们可以使用递归的方法来枚举密码。

def generate_passwords(n):
  """
  生成所有满足条件的密码。

  Args:
    n: 密码的长度。

  Returns:
    一个包含所有满足条件的密码的列表。
  """

  # 如果密码的长度为 0,则返回一个空列表。
  if n == 0:
    return []

  # 如果密码的长度为 1,则返回所有满足条件的单个字符。
  if n == 1:
    return ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
            "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
            "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
            "u", "v", "w", "x", "y", "z",
            "!", "@", "#", "
def generate_passwords(n):
  """
  生成所有满足条件的密码。

  Args:
    n: 密码的长度。

  Returns:
    一个包含所有满足条件的密码的列表。
  """

  # 如果密码的长度为 0,则返回一个空列表。
  if n == 0:
    return []

  # 如果密码的长度为 1,则返回所有满足条件的单个字符。
  if n == 1:
    return ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
            "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
            "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
            "u", "v", "w", "x", "y", "z",
            "!", "@", "#", "$", "%", "^", "&", "*", "(", ")",
            "-", "+"]

  # 否则,递归生成密码。
  else:
    passwords = []
    for password in generate_passwords(n - 1):
      # 添加一个数字。
      passwords.extend([password + str(i) for i in range(10)])

      # 添加一个小写字母。
      passwords.extend([password + chr(i) for i in range(ord("a"), ord("z") + 1)])

      # 添加一个大写字母。
      passwords.extend([password + chr(i) for i in range(ord("A"), ord("Z") + 1)])

      # 添加一个特殊符号。
      passwords.extend([password + chr(i) for i in range(33, 48)])

    return passwords


def check_passwords(passwords, n):
  """
  检查密码是否满足条件。

  Args:
    passwords: 密码列表。
    n: 密码的长度。

  Returns:
    一个包含所有满足条件的密码的列表。
  """

  valid_passwords = []
  for password in passwords:
    # 检查密码是否至少包含一个大写字母、一个小写字母、一个数字和一个特殊符号。
    if any(char.isupper() for char in password) and \
       any(char.islower() for char in password) and \
       any(char.isdigit() for char in password) and \
       any(char in "!@#$%^&*()-+" for char in password) and \
       len(password) >= n:
      valid_passwords.append(password)

  return valid_passwords


def main():
  """
  主函数。
  """

  n = 4
  passwords = generate_passwords(n)
  valid_passwords = check_passwords(passwords, n)

  print("所有满足条件的密码:")
  for password in valid_passwords:
    print(password)


if __name__ == "__main__":
  main()
quot;
, "%", "^", "&", "*", "(", ")", "-", "+"] # 否则,递归生成密码。 else: passwords = [] for password in generate_passwords(n - 1): # 添加一个数字。 passwords.extend([password + str(i) for i in range(10)]) # 添加一个小写字母。 passwords.extend([password + chr(i) for i in range(ord("a"), ord("z") + 1)]) # 添加一个大写字母。 passwords.extend([password + chr(i) for i in range(ord("A"), ord("Z") + 1)]) # 添加一个特殊符号。 passwords.extend([password + chr(i) for i in range(33, 48)]) return passwords def check_passwords(passwords, n): """ 检查密码是否满足条件。 Args: passwords: 密码列表。 n: 密码的长度。 Returns: 一个包含所有满足条件的密码的列表。 """ valid_passwords = [] for password in passwords: # 检查密码是否至少包含一个大写字母、一个小写字母、一个数字和一个特殊符号。 if any(char.isupper() for char in password) and \ any(char.islower() for char in password) and \ any(char.isdigit() for char in password) and \ any(char in "!@#$%^&*()-+" for char in password) and \ len(password) >= n: valid_passwords.append(password) return valid_passwords def main(): """ 主函数。 """ n = 4 passwords = generate_passwords(n) valid_passwords = check_passwords(passwords, n) print("所有满足条件的密码:") for password in valid_passwords: print(password) if __name__ == "__main__": main()

总结

这道题的解题思路很简单,我们可以使用模拟的方法,枚举出所有满足条件的密码。为了提高效率,我们可以使用递归的方法来枚举密码。

这道题的主要难点在于如何判断密码是否满足条件,我们需要检查密码是否至少包含一个大写字母、一个小写字母、一个数字和一个特殊符号。我们可以使用正则表达式来实现这个功能。

希望这篇文章对您有所帮助,如果您有任何问题,欢迎在评论区留言。