如何修改字符串解密代码以支持多位数与多字符重复?
问题描述
需要解密类似a12b20(a重复12次、b重复20次)、cd3(cd重复3次)的压缩字符串,获取解密后字符串的第k个字符(1-based索引)。现有kThCharaterOfDecryptedString函数仅支持单数字重复,遇到多位数时无输出,添加多位数处理逻辑后出现运行时错误,寻求代码修改建议。
原错误代码
def kThCharaterOfDecryptedString(s, k): compress_str = "" str1 = "" lastdigit = "" i = 0 while i<len(s): str1 += s[i] if str1.isdigit() == True: for char in range(int(str1)): compress_str += lastdigit lastdigit = "" else: str1 = "" compress_str += s[i] if len(lastdigit) == True: lastdigit += s[i] else: lastdigit = s[i] i += 1 if k in range(len(compress_str)): return compress_str[(k-1) % len(compress_str)] else: return -1 s = 'a12b20' k = 8 print(kThCharaterOfDecryptedString(s, k))
代码问题分析
- 多位数处理失效:原代码每次仅读取单个字符判断是否为数字,无法识别连续多位数(如
12会被拆成两次处理),导致重复次数计算完全错误。 - 拼接逻辑混乱:非数字分支中直接将当前字符加入结果串,导致前缀字符被额外多添加一次(比如
a先被加1次,再按次数重复,实际重复次数多了1次)。 - 变量逻辑错误:
lastdigit变量名与实际存储的前缀字符串不符,且len(lastdigit) == True的判断不规范,非零长度都会被视为True,逻辑易出错。 - 内存效率低下:直接生成完整解密字符串,当重复次数极大时会占用大量内存,甚至引发崩溃。
修正方案与代码
核心思路
- 分段解析:遍历字符串时,先收集连续非数字字符作为前缀,再收集连续数字作为重复次数。
- 定位分段而非生成全串:通过计算各分段总长度,直接判断k落在哪个分段,再计算具体字符,避免内存浪费。
- 修正变量与判断逻辑:明确区分前缀和重复次数的存储,修复错误的条件判断。
修正后的代码
def kThCharaterOfDecryptedString(s, k): n = len(s) i = 0 while i < n: # 收集连续的非数字前缀 prefix = "" while i < n and not s[i].isdigit(): prefix += s[i] i += 1 # 收集连续的数字作为重复次数 num_str = "" while i < n and s[i].isdigit(): num_str += s[i] i += 1 repeat = int(num_str) if num_str else 1 # 无数字时默认重复1次 prefix_len = len(prefix) total_len = prefix_len * repeat # 判断k是否在当前分段内 if k <= total_len: # 计算前缀中的具体位置 pos = (k - 1) % prefix_len return prefix[pos] else: # 减去当前分段长度,继续查找下一段 k -= total_len # 输入无效时返回-1 return -1 # 测试用例 s = 'a12b20' k = 8 print(kThCharaterOfDecryptedString(s, k)) # 输出 'a'
内容的提问来源于stack exchange,提问作者AniRoll
相关产品推荐
相关产品推荐

