20天拿下华为OD笔试之【哈希表】2023Q1A-删除最少字符【欧弟算法】全网注释最详细分类最全的华为OD真题题解】

【哈希表】2023Q1A-删除最少字符

题目描述与示例

题目

删除字符串s中出现次数最少的字符,如果多个字符出现次数一样则都删除。

输入

输入只包含小写字母

输出描述

输出删除后剩余的字符串;若删除后字符串长度为0,则输出字符串"empty"

示例一

输入

abcdd

输出

dd

示例二

输入

aabbccdd

输出

empty

解题思路

为了删除掉字符串s中出现次数最少的字符,我们必须先统计s中的所有字母的出现个数,很容易想到使用哈希表的Counter()来完成这个功能。然后我们再统计哪些字母出现的次数为最小出现次数,用一个哈希集合记录这些需要删除的字母,再使用字符串的replace()方法或者join()方法即可完成删除。

本题显然也是哈希表在统计元素频率类型的题目中的典型应用。

代码

# 题目:2023Q1A-删除最少字符
# 分值:100
# 作者:闭着眼睛学数理化
# 算法:哈希表
# 代码看不懂的地方,请直接在群上提问

# 导入collections中的Counter计数器类,使用dict()也可以,但是代码就要多一些判断
from collections import Counter

# 输入原始字符串s
s = input()

# 直接调用Counter()计数器类,获得所有字符的频率
cnt = Counter(s)

# 获得所有频率中的最小值,即最小频率min_cnt
min_cnt = min(cnt.values())

# 如果某个字符ch的频率等于最小频率,则记录在哈希集合min_cnt_set中
min_cnt_set = set(ch for ch, ch_cnt in cnt.items() if ch_cnt == min_cnt)

# 再次遍历s中的所有字符ch,如果ch不位于哈希集合min_cnt_set中,则可以保留,储存在ans数组中
ans = [ch for ch in s if ch not in min_cnt_set]

# 如果ans的长度为0,说明所有字符均被删除,此时需要输出"empty"
# 否则,则用字符串的join()方法,将ans数组转化为字符串并输出
print("empty" if len(ans) == 0 else "".join(ans))

时空复杂度

时间复杂度:O(N)。仅需一次遍历字符串数组。

空间复杂度:O(1)。无论是哈希表还是列表,长度最多为26,为常数级别空间。
华为OD算法冲刺训练
华为OD算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

30+天陪伴式学习,20+直播课时,300+动画图解视频,200+LeetCode经典题,100+华为OD真题,还有简历修改与模拟面试将为你解锁

可查看链接 OD算法冲刺训练课程表 & OD真题汇总(持续更新)

绿色聊天软件戳 sheepvipvip了解更多

你可能感兴趣的:(#,二分查找,最新华为OD真题,#,哈希表,算法,华为od,散列表)