2025-08-11:奇偶频次间的最大差值Ⅰ。用go语言,给定一个只含小写字母的字符串 s。对任意两个字符 x 和 y(它们在

举报
福大大架构师每日一题 发表于 2025/08/11 07:58:38 2025/08/11
【摘要】 2025-08-11:奇偶频次间的最大差值Ⅰ。用go语言,给定一个只含小写字母的字符串 s。对任意两个字符 x 和 y(它们在 s 中的出现次数分别记为 count(x)、count(y)),当 count(x) 是奇数且 count(y) 是偶数时,考虑差值 count(x)−count(y)。在所有满足条件的字符对中取最大的差值并返回。这里 count© 表示字符 c 在字符串 s 中出...

2025-08-11:奇偶频次间的最大差值Ⅰ。用go语言,给定一个只含小写字母的字符串 s。对任意两个字符 x 和 y(它们在 s 中的出现次数分别记为 count(x)、count(y)),当 count(x) 是奇数且 count(y) 是偶数时,考虑差值 count(x)−count(y)。在所有满足条件的字符对中取最大的差值并返回。这里 count© 表示字符 c 在字符串 s 中出现的次数。

3 <= s.length <= 100。

s 仅由小写英文字母组成。

s 至少由一个出现奇数次的字符和一个出现偶数次的字符组成。

输入:s = “aaaaabbc”。

输出:3。

解释:

字符 ‘a’ 出现 奇数次 ,次数为 5 ;字符 ‘b’ 出现 偶数次 ,次数为 2 。

最大差值为 5 - 2 = 3 。

题目来自力扣3442。

分步骤描述过程

  1. 统计字符频次

    • 创建一个映射(map)c,键为字符(rune),值为该字符在字符串中出现的次数。
    • 遍历字符串 s 的每个字符,更新映射 c 中的计数值。例如:
      • 字符 'a' 出现 5 次,c['a'] = 5
      • 字符 'b' 出现 2 次,c['b'] = 2
      • 字符 'c' 出现 1 次,c['c'] = 1
  2. 初始化关键变量

    • maxOdd:记录所有奇数频次中的最大值,初始化为 1(因奇数频次至少为 1)。
    • minEven:记录所有偶数频次中的最小值,初始化为字符串长度(例如 len(s) = 8),这是一个安全的上限值。
  3. 遍历频次映射,更新关键变量

    • 对映射 c 中的每个频次值 value
      • value 是奇数(value % 2 == 1):
        • 比较 value 与当前 maxOdd,更新 maxOdd = max(maxOdd, value)
        • 例如:value = 5'a')时,maxOdd 从 1 更新为 5;value = 1'c')时,maxOdd 保持 5。
      • value 是偶数(value % 2 == 0):
        • 比较 value 与当前 minEven,更新 minEven = min(minEven, value)
        • 例如:value = 2'b')时,minEven 从 8 更新为 2。
  4. 计算并返回结果

    • 返回差值 maxOdd - minEven
    • 例如:maxOdd = 5'a'),minEven = 2'b'),结果为 5 - 2 = 3

时间复杂度和额外空间复杂度

  • 时间复杂度O(n),其中 n 是字符串长度。
    • 遍历字符串统计频次:O(n)
    • 遍历频次映射:映射键的数量最多为 26(小写字母),是常数操作 O(1)
  • 额外空间复杂度O(1)
    • 频次映射 c 最多存储 26 个键值对(小写字母),是常数空间。
    • 变量 maxOddminEven 占用常数空间。

Go完整代码如下:

package main

import (
	"fmt"
)

func maxDifference(s string) int {
	c := make(map[rune]int)
	for _, ch := range s {
		c[ch]++
	}
	maxOdd, minEven := 1, len(s)
	for _, value := range c {
		if value%2 == 1 {
			maxOdd = max(maxOdd, value)
		} else {
			minEven = min(minEven, value)
		}
	}
	return maxOdd - minEven
}

func main() {
	s := "aaaaabbc"
	result := maxDifference(s)
	fmt.Println(result)
}

在这里插入图片描述

Python完整代码如下:

# -*-coding:utf-8-*-

from collections import Counter

def max_difference(s: str) -> int:
    counts = Counter(s)
    max_odd = 1
    min_even = len(s)
    for v in counts.values():
        if v % 2 == 1:
            max_odd = max(max_odd, v)
        else:
            min_even = min(min_even, v)
    return max_odd - min_even

if __name__ == "__main__":
    s = "aaaaabbc"
    result = max_difference(s)
    print(result)

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。