谷歌(Google)面试过程的第一步,你可能会收到一个在线评估链接。 评估有效期为 7 天,包含两个编码问题,需要在一小时内完成。 以下是一些供你练习的在线评估问题。
在本章结尾处,还提供了有关 Google 面试不同阶段的更多详细信息。
密钥格式化
给定一个许可密钥字符串 s,仅由字母、数字字符和破折号组成。字符串由 n 个破折号分成 n + 1 组。你也会得到一个整数 k 。
我们想要重新格式化字符串 s,使每一组包含 k 个字符,除了第一组,它可以比 k 短,但仍然必须包含至少一个字符。此外,两组之间必须插入破折号,并且应该将所有小写字母转换为大写字母。
返回 重新格式化的许可密钥 。
示例 1:
输入:S = “5F3Z-2e-9-w”, k = 4
输出:“5F3Z-2E9W”
解释:字符串 S 被分成了两个部分,每部分 4 个字符;
注意,两个额外的破折号需要删掉。
示例 2:
输入:S = “2-5g-3-J”, k = 2
输出:“2-5G-3J”
解释:字符串 S 被分成了 3 个部分,按照前面的规则描述,第一部分的字符可以少于给定的数量,其余部分皆为 2 个字符。
提示:
- 1 <= s.length <= 105
- s 只包含字母、数字和破折号 ‘-’.
- 1 <= k <= 104
思路一:
- 首先,去除字符串中的所有破折号,并将字符串中的字母全部转换为大写字母。
- 然后,计算去除破折号后的字符串的长度,并根据给定的 k 值,计算出第一个部分的长度。
- 将第一个部分长度不足 k 的部分与剩余部分组合成一个新的字符串,同时在部分之间插入破折号。
代码示例1:
def licenseKeyFormatting(s, k):# 去除字符串中的破折号,并将所有字母转换为大写s = s.replace('-', '').upper()n = len(s)first_part_length = n % k # 计算第一个部分的长度result = s[:first_part_length] # 第一个部分i = first_part_length# 循环构造新的字符串while i < n:if result:result += '-'result += s[i:i+k]i += kreturn result# 示例 1
S1 = "5F3Z-2e-9-w"
k1 = 4
print(licenseKeyFormatting(S1, k1)) # 输出:“5F3Z-2E9W”# 示例 2
S2 = "2-5g-3-J"
k2 = 2
print(licenseKeyFormatting(S2, k2)) # 输出:“2-5G-3J”
这个函数首先去除字符串中的破折号,并将所有字母转换为大写。然后根据给定的 k 值计算第一个部分的长度,以及剩余部分的长度。接下来,使用循环将第一个部分长度不足 k 的部分与剩余部分组合成一个新的字符串,同时在部分之间插入破折号。最后返回新的字符串。
思路二:
第二种解题思路是使用栈来处理字符串。具体步骤如下:
- 将字符串中的破折号去除,并将所有字母转换为大写。
- 从右向左遍历处理字符串,每次处理 k 个字符,并将其放入栈中。
- 在放入栈之前,检查当前栈中字符的个数是否达到 k 个,如果是,则在字符之前插入一个破折号。
- 最后从栈中弹出字符,构造最终的字符串。
代码示例2:
def licenseKeyFormatting(s, k):# 去除字符串中的破折号,并将所有字母转换为大写s = s.replace('-', '').upper()n = len(s)stack = []count = 0# 从右向左遍历处理字符串for i in range(n - 1, -1, -1):if s[i].isalnum():stack.append(s[i])count += 1# 每次处理 k 个字符,检查是否需要插入破折号if count == k and i != 0:stack.append('-')count = 0# 构造最终的字符串result = ''while stack:result += stack.pop()return result# 示例 1
S1 = "5F3Z-2e-9-w"
k1 = 4
print(licenseKeyFormatting(S1, k1)) # 输出:“5F3Z-2E9W”# 示例 2
S2 = "2-5g-3-J"
k2 = 2
print(licenseKeyFormatting(S2, k2)) # 输出:“2-5G-3J”
这个函数首先去除字符串中的破折号,并将所有字母转换为大写。然后从右向左遍历处理字符串,每次处理 k 个字符,并将其放入栈中。在放入栈之前,检查当前栈中字符的个数是否达到 k 个,如果是,则在字符之前插入一个破折号。最后从栈中弹出字符,构造最终的字符串。
思路三:
第三种解题思路是使用递归。具体步骤如下:
- 去除字符串中的破折号,并将所有字母转换为大写。
- 递归地处理字符串,每次处理 k 个字符。
- 在处理字符串时,首先处理最后一个部分,然后递归处理前面的部分。
- 在处理字符串的过程中,每次递归都将结果插入到当前部分的前面,并在部分之间插入破折号。
- 最后返回处理完的字符串。
代码示例3:
def licenseKeyFormatting(s, k):# 去除字符串中的破折号,并将所有字母转换为大写s = s.replace('-', '').upper()n = len(s)# 递归处理字符串def format_helper(s):if len(s) <= k:return selse:return format_helper(s[:-k]) + '-' + s[-k:]return format_helper(s)# 示例 1
S1 = "5F3Z-2e-9-w"
k1 = 4
print(licenseKeyFormatting(S1, k1)) # 输出:“5F3Z-2E9W”# 示例 2
S2 = "2-5g-3-J"
k2 = 2
print(licenseKeyFormatting(S2, k2)) # 输出:“2-5G-3J”
这个函数首先去除字符串中的破折号,并将所有字母转换为大写。然后使用递归处理字符串,每次处理 k 个字符。在处理字符串的过程中,首先处理最后一个部分,然后递归处理前面的部分,并将结果插入到当前部分的前面,并在部分之间插入破折号。最后返回处理完的字符串。