字母在字符串中的百分比求解方案 | 力扣 2278 题解
问题描述
给定一个字符串 s
和一个字母 letter
,我们需要计算 letter
在 s
中出现的百分比,并将结果向下取整。例如,如果字符串是 "foobar"
,字母是 "o"
,那么 o
出现了 2 次,总长度是 6,百分比是 (2/6)*100 = 33.33%
,向下取整后是 33%。
示例 1:
输入:s = "foobar", letter = "o"
输出:33
解释:字母 o
在字符串中占到的百分比是 2/6 * 100 = 33%,向下取整后返回 33。
示例 2:
输入:s = "jjjj", letter = "k"
输出:0
解释:字母 k
在字符串中没有出现,百分比是 0%,返回 0。
解法一:使用 count()
方法
最直接的方法是利用 Python 字符串的内置 count()
函数。这个方法可以快速统计一个字符在字符串中出现的次数。
class Solution:
def percentageLetter(self, s: str, letter: str) -> int:
# 计算字母出现次数
count = s.count(letter)
# 计算百分比并向下取整
return int((count / len(s)) * 100)
思路:
- 使用
s.count(letter)
统计letter
在s
中的出现次数。 - 计算百分比
(count / len(s)) * 100
。 - 使用
int()
将结果向下取整。
优点:
- 代码简洁,易于理解。
count()
是 Python 内置方法,性能较高。
缺点:
- 如果需要统计多个字符的出现次数,这种方法会重复遍历字符串。
解法二:使用循环计数
手动遍历字符串,逐个字符计数。
class Solution:
def percentageLetter(self, s: str, letter: str) -> int:
count = 0
# 遍历字符串每个字符
for char in s:
if char == letter:
count += 1
# 计算百分比并向下取整
return int((count / len(s)) * 100)
思路:
- 初始化计数器
count
为 0。 - 遍历字符串中的每个字符,如果字符等于
letter
,计数器加 1。 - 计算百分比并向下取整。
优点:
- 代码逻辑清晰,适合初学者理解。
- 如果需要统计多个字符的出现次数,可以扩展为一个计数器字典。
缺点:
- 需要手动遍历字符串,代码稍显冗长。
解法三:使用 Counter
集合
利用 Python 的 collections
模块中的 Counter
类来统计字符出现次数。
class Solution:
def percentageLetter(self, s: str, letter: str) -> int:
from collections import Counter
# 统计所有字符出现次数
char_count = Counter(s)
# 计算指定字母的百分比并向下取整
return int((char_count[letter] / len(s)) * 100)
思路:
- 使用
Counter(s)
统计字符串中每个字符的出现次数。 - 通过
char_count[letter]
获取letter
的出现次数。 - 计算百分比并向下取整。
优点:
Counter
是一个高效的工具,适合处理复杂的字符统计问题。- 如果需要统计多个字符的出现次数,这种方法非常方便。
缺点:
- 需要导入额外的模块,代码稍显复杂。
- 空间复杂度较高,因为需要存储所有字符的计数。
算法分析
所有方法的时间复杂度都是 O(n),其中 n 是字符串的长度。这是因为每种方法都需要遍历整个字符串来统计字符出现次数。
空间复杂度
- 解法一和解法二:O(1),只需要常数空间。
- 解法三:O(k),其中 k 是字符串中不同字符的数量。
测试案例分析
示例 1:s = "foobar", letter = "o"
- 字母
o
出现 2 次,总长度为 6。 - 百分比:
(2/6) * 100 = 33.33%
,向下取整为 33%。
示例 2:s = "jjjj", letter = "k"
- 字母
k
没有出现,总长度为 4。 - 百分比:
(0/4) * 100 = 0%
。
总结
三种方法都能正确解决问题,但各有优缺点:
- 解法一:代码简洁高效,适合快速实现。
- 解法二:逻辑清晰,适合学习和扩展。
- 解法三:功能强大,适合复杂场景。
对于这个简单问题,推荐使用 解法一,因为它最简洁高效。如果需要处理更复杂的字符统计问题,可以考虑使用 解法三。
希望这篇博客能帮助你更好地理解这个问题的解法!如果有任何疑问或建议,欢迎在评论区留言! 😊