CodeWars连续字符串拼接问题代码无法通过随机测试求助
解决CodeWars连续字符串拼接问题的代码排查与修正
问题说明
给定字符串数组strarr和整数k,需返回数组中k个连续字符串拼接成的首个最长字符串。现有代码通过了示例测试,但无法通过随机测试。
现有代码问题分析
第一个版本代码逻辑错误
strarr = [] def longest_consec(strarr, k): strarr.append('') length = len(strarr) cons_list = [] end = k start = 0 freq = -length/2 final_string = [] largest = max(strarr, key=len, default='') if k == 1: return largest elif 1 < k < length: while(freq <= 1): cons_list.append(strarr[start:end]) start += k-1 end += k-1 freq += 1 for index in cons_list: final_string.append(''.join(index)) return max(final_string, key=len, default='') else: return ""
- 错误点:
- 手动给输入数组
strarr追加空字符串,改变了原数组的长度和内容,导致后续计算完全偏离预期。 while循环逻辑完全错误,通过freq和跳步k-1的方式选取连续子数组,仅能覆盖极少数情况,漏掉了绝大多数可能的连续k个字符串组合。- 当k=1时,返回的是修改后数组中的最长字符串,而非原数组的结果。
- 手动给输入数组
第二个版本代码覆盖不全
strarr = [] def longest_consec(strarr, k): strarr.append('') length = len(strarr) largest = max(strarr, key=len, default='') pos = int(strarr.index(largest)) if k == 1: return largest elif 1 < k < length: prev_string = ''.join(strarr[pos+1-k:pos+1]) next_string = ''.join(strarr[pos:pos+k]) if len(prev_string) >= len(next_string): res = prev_string else: res = next_string return res else: return "" print(longest_consec(["zone", "abigail", "theta", "form", "libe"], 2))
- 错误点:
- 同样修改了原输入数组,导致索引计算错误。
- 仅围绕单个最长字符串的前后拼接组合进行比较,完全忽略了其他连续k个字符串拼接后长度更长的情况。
- 若数组中有多个长度相同的最长字符串,
index只会返回第一个出现的位置,遗漏其他可能的最优组合。
正确代码实现
def longest_consec(strarr, k): n = len(strarr) # 处理边界情况:k无效或数组为空 if k <= 0 or k > n or n == 0: return "" max_length = -1 result = "" # 遍历所有可能的连续k个字符串的起始索引 for i in range(n - k + 1): # 拼接当前连续k个字符串 current = ''.join(strarr[i:i+k]) current_len = len(current) # 更新最长字符串(优先保留第一个出现的) if current_len > max_length: max_length = current_len result = current return result
代码说明
- 边界处理:先判断k是否合法(k≤0或k超过数组长度),或数组为空时直接返回空字符串。
- 遍历所有可能组合:通过
range(n - k + 1)获取所有合法的起始索引,确保能覆盖每一组连续的k个字符串。 - 记录最优结果:对每个拼接后的字符串计算长度,仅当当前长度大于已记录的最大长度时更新结果,保证返回的是首个最长的拼接字符串。
内容的提问来源于stack exchange,提问作者Promela Tajrina
相关产品推荐
相关产品推荐

