返回
剑指LeetCode双周赛106:揭秘迷人数字与最长半重复子字符串的奥秘
闲谈
2023-09-19 17:04:53
揭开迷人数字和半重复子字符串的面纱:算法与实战
迷人数字:定义与算法
准备踏上一段探索迷人数字的旅程。迷人数字就像数字界的独角兽,必须同时满足两个条件才能赢得这个称号:
- 各位数字之和为偶数
- 各位数字的平方和也是偶数
想象一下数字12345,它的各位之和为15(奇数),而各位平方之和为144(偶数)。因此,12345荣获了迷人数字的称号。
揭开迷人数字的秘密,我们遵循以下步骤:
- 将数字转换为字符串。
- 遍历字符串,将每个字符转换为数字。
- 计算各位数字之和。
- 计算各位数字的平方和。
- 检查这两个值是否都为偶数。
def is_charming(n):
"""
判断一个数字是否是迷人的。
Args:
n: 要判断的数字。
Returns:
如果n是迷人的,则返回True,否则返回False。
"""
# 将数字转换为字符串。
s = str(n)
# 遍历字符串,将每个字符转换为数字。
digits = [int(c) for c in s]
# 计算各位数字之和。
sum_digits = sum(digits)
# 计算各位数字的平方和。
sum_squares = sum(d**2 for d in digits)
# 检查这两个值是否都为偶数。
return sum_digits % 2 == 0 and sum_squares % 2 == 0
寻找半重复子字符串:技巧与策略
现在,让我们将目光转向另一个激动人心的挑战:寻找半重复子字符串。半重复子字符串是指字符串中出现两次的子字符串。例如,“abcabcabc”中最长的半重复子字符串就是“abc”。
为了找出这个难以捉摸的字符串,我们采用以下策略:
- 生成字符串的所有子字符串。
- 检查每个子字符串是否在字符串中出现两次。
- 选择最长的半重复子字符串。
def longest_semi_repetitive_substring(s):
"""
找到一个字符串中最长的半重复子字符串。
Args:
s: 要查找的字符串。
Returns:
最长的半重复子字符串。
"""
# 生成字符串的所有子字符串。
substrings = []
for i in range(len(s)):
for j in range(i + 1, len(s) + 1):
substrings.append(s[i:j])
# 检查每个子字符串是否在字符串中出现两次。
semi_repetitive_substrings = []
for substring in substrings:
if s.count(substring) == 2:
semi_repetitive_substrings.append(substring)
# 选择最长的半重复子字符串。
return max(semi_repetitive_substrings, key=len)
常见问题解答
-
Q:什么是迷人数字?
A:迷人数字同时满足两个条件:各位数字之和为偶数,各位数字的平方和也是偶数。 -
Q:如何找到一个字符串中最长的半重复子字符串?
A:生成字符串的所有子字符串,检查每个子字符串是否在字符串中出现两次,并选择最长的一个。 -
Q:为什么这些算法很重要?
A:迷人数字算法可以用于密码学和数据验证,而半重复子字符串算法可以用于文本挖掘和比较。 -
Q:这些算法的复杂度是多少?
A:迷人数字算法的时间复杂度为O(n),其中n是数字的位数。半重复子字符串算法的时间复杂度为O(n^3),其中n是字符串的长度。 -
Q:我可以在哪里找到更多关于这些算法的信息?
A:有关迷人数字算法的更多信息,请访问:https://en.wikipedia.org/wiki/Charming_number。有关半重复子字符串算法的更多信息,请访问:https://www.geeksforgeeks.org/longest-repeating-subsequence/。