如何在单次遍历字符串时同步找出出现次数最少的字符?
可以在同一循环内同时统计出现次数最多和最少的字符
当然可以在统计最大出现次数的同一个循环里完成最小次数字符的统计,核心是在每次更新字符计数后,同步维护最小次数的相关变量,不过需要注意初始值的设置和第一次统计时的处理。
调整后的代码示例
sally = "sally sells sea shells by the sea shore" characters = {} best_char = '' maxx_num = 0 worst_char = '' # 初始最小次数设为无穷大,确保第一次统计的字符次数能覆盖它 min_num = float('inf') for ch in sally: # 初始化字符计数(如果不存在) if characters.get(ch) is None: characters[ch] = 0 characters[ch] += 1 # 更新最大次数和对应字符 if characters[ch] > maxx_num: maxx_num = characters[ch] best_char = ch # 更新最小次数和对应字符 if characters[ch] < min_num: min_num = characters[ch] worst_char = ch
关键逻辑说明
- 初始值设置:
min_num不能像maxx_num那样设为0,因为第一个字符的计数是1,会比0大,无法触发更新。用float('inf')(无穷大)作为初始值,能确保第一次统计的字符次数必然小于它,完成第一次初始化。 - 同步更新:每次字符计数更新后,立刻检查是否需要更新最大或最小的记录,不需要等到所有字符统计完再遍历字典,时间复杂度仍为O(n)(n为字符串长度),没有额外开销。
- 特殊情况处理:如果存在多个字符出现次数相同且都是最小值,上述代码会保留最后一个遍历到的字符;如果需要保留第一个遇到的最小值字符,可以在判断时增加条件,比如仅当计数严格小于当前最小值时才更新。
内容的提问来源于stack exchange,提问作者osama yaccoub
相关产品推荐
相关产品推荐

