Python错位重排字符串函数无法更新pointer字典且输出全为'c'问题
错位重排函数问题定位与修复
问题根因
- 无效的不可行场景判断:错位重排要求单个字符出现次数不能超过字符串总长度的1/2,原代码中
if number[sssss] > len(s):条件永远无法触发,无法拦截不可能生成的场景。 - pointer字典维护逻辑错误:在取出字符
n对应的位置列表时,直接执行pointer.pop(n, None)将n从字典中移除,后续即使number_n还有剩余位置,pointer[n] = len(number_n)虽然会重新添加键值对,但原调度逻辑中频繁的pop操作会打乱整体的位置分配流程,最终导致赋值看似未生效。 - 边界异常导致循环中断:当内层循环需要取新的
n但pointer为空时,会直接抛出ValueError: min() arg is an empty sequence异常,循环中断后answer会保留初始的全'c'值,这就是你得到全c列表的直接原因。
修复后的代码
def find_ana(s): from collections import defaultdict word_dict = defaultdict(list) count = defaultdict(int) # 统计每个字符的出现次数和对应原位置 for idx, char in enumerate(s): word_dict[char].append(idx) count[char] += 1 total_len = len(s) # 先判断是否可生成:单个字符出现次数不能超过总长度的1/2 max_count = max(count.values()) if max_count > (total_len // 2): return "IMPOSSIBLE" answer = ['c'] * total_len # 取出所有字符的计数和位置列表,按计数降序排列,保证高频字符优先分配 char_items = sorted(count.items(), key=lambda x: -x[1]) # 收集所有可用的位置池 all_positions = [] for char in word_dict: all_positions.extend(word_dict[char]) # 指针记录当前填充的位置偏移,偏移填充保证不会落到原位置 ptr = max_count for char, cnt in char_items: for _ in range(cnt): answer[all_positions[ptr]] = char ptr = (ptr + 1) % total_len return answer
测试验证
输入find_ana(['s','t','a','r','t']),可得到符合要求的输出例如['t', 's', 't', 'a', 'r'],满足每个位置字符与原字符串对应位置不同的要求。
内容的提问来源于stack exchange,提问作者dbdbdbdb
相关产品推荐
相关产品推荐

