字母在字符串中的百分比

标签: 字符串

难度: Easy

给你一个字符串 s 和一个字符 letter ,返回在 s 中等于 letter 字符所占的 百分比 ,向下取整到最接近的百分比。

示例 1:

输入:s = "foobar", letter = "o"
输出:33
解释:
等于字母 'o' 的字符在 s 中占到的百分比是 2 / 6 * 100% = 33% ,向下取整,所以返回 33 。

示例 2:

输入:s = "jjjj", letter = "k"
输出:0
解释:
等于字母 'k' 的字符在 s 中占到的百分比是 0% ,所以返回 0 。

提示:

  • 1 <= s.length <= 100
  • s 由小写英文字母组成
  • letter 是一个小写英文字母

Submission

运行时间: 24 ms

内存: 16.0 MB

class Solution:
    def percentageLetter(self, s: str, letter: str) -> int:

        return s.count(letter)* 100 // len(s)

Explain

该题解通过使用Python内置的字符串方法count来计算字符串s中字符letter出现的次数。得到这个计数值后,乘以100,然后使用整数除法//来确保结果是一个整数,并且自动向下取整。这样就可以直接得到字符letter在字符串s中占的百分比。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def percentageLetter(self, s: str, letter: str) -> int:
        # 计算字符串s中字符letter的出现次数
        count = s.count(letter)
        # 计算s的长度
        total_length = len(s)
        # 计算百分比并通过整数除法实现向下取整
        percentage = count * 100 // total_length
        # 返回计算结果
        return percentage

Explore

Python的`s.count(letter)`方法是设计来准确计算子串在字符串中出现的次数的,不论是ASCII字符还是Unicode字符。因此,在大多数情况下,此方法都能够准确地返回指定字符的出现次数。然而,需要注意的是,字符的比较是基于确切的字符代码点匹配的,因此对于一些具有多种编码形式的Unicode字符(如带变音符的字符),可能需要正规化字符到统一形式才能正确计数。

使用整数除法`//`确实会导致结果向下取整,这意味着在一些边界情况下,如`count`非常接近`total_length`(例如99出现在100字符的字符串中),计算得到的百分比为99%,而实际比例更接近100%。这种情况反映了整数除法在处理百分比时可能的精度损失。如果需要更高精度的处理,可以考虑使用浮点数除法和四舍五入来得到更精确的结果。

当`letter`字符在字符串`s`中完全不存在时,`count`会是0,因此`count * 100 // total_length`计算结果也会是0,这在数学上是正确的。然而,在某些应用场景中,可能需要区分'字符不存在'与'字符存在但比例为0%'的情况。在这种情况下,可能需要在返回结果前做额外判断,或者调整返回值以提供更多信息。

如果需要为多个字符计算百分比,多次遍历字符串确实是一种资源消耗较高的方法。一个更高效的方法是单次遍历字符串,同时统计所有关心的字符的出现次数。这可以通过使用字典来实现,其中键为字符,值为该字符的出现次数。遍历结束后,可以根据字符串的总长度计算每个字符的百分比。这种方法只需要一次遍历,效率更高,尤其是在处理大型字符串或字符集较大时更为明显。