news 2026/7/21 5:55:15

2026-07-20:镜像频次距离。用go语言,给定一个仅包含小写英文字母和数字的字符串。每个字符都有一个镜像字符:对于字母,‘a‘ 的镜像是 ‘z‘,‘b‘ 的镜像是 ‘y‘,依此类推,直至 ‘z‘

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2026-07-20:镜像频次距离。用go语言,给定一个仅包含小写英文字母和数字的字符串。每个字符都有一个镜像字符:对于字母,‘a‘ 的镜像是 ‘z‘,‘b‘ 的镜像是 ‘y‘,依此类推,直至 ‘z‘

2026-07-20:镜像频次距离。用go语言,给定一个仅包含小写英文字母和数字的字符串。每个字符都有一个镜像字符:对于字母,‘a’ 的镜像是 ‘z’,‘b’ 的镜像是 ‘y’,依此类推,直至 ‘z’ 的镜像是 ‘a’;对于数字,‘0’ 的镜像是 ‘9’,‘1’ 的镜像是 ‘8’,依此类推,直至 ‘9’ 的镜像是 ‘0’。用 freq(x) 表示字符 x 在字符串中出现的次数。

对于字符串中实际出现过的每一种字符 c,设它的镜像为 m,计算该字符出现次数与其镜像出现次数的绝对差 |freq© - freq(m)|。镜像对 (c, m) 与 (m, c) 视为同一对,在计算总和时每个不同的镜像对只计算一次。最后返回所有不同镜像对的绝对差之和。

1 <= s.length <= 500000。

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

输入: s = “ab1z9”。

输出: 3。

解释:

对于每个镜像对:

cmfreq©freq(m)|freq© - freq(m)|
az110
by101
18101
90101

因此,答案是 0 + 1 + 1 + 1 = 3。

题目来自力扣3889。

第一步:统计字符出现频次

  1. 创建计数数组
    代码中定义了一个长度为'z' + 1(即 123)的整型数组cnt,用于存储每个字符的出现次数。这个数组的大小足够覆盖所有小写字母'a''z'的 ASCII 码值,同时也能容纳数字字符'0''9'的 ASCII 码值(它们在 ASCII 表中的位置也在这个范围内)。

  2. 遍历输入字符串
    对字符串s中的每个字符ch,执行cnt[ch]++,将对应 ASCII 码位置的计数值加 1。
    例如对于输入"ab1z9"

    • cnt['a'] = 1
    • cnt['b'] = 1
    • cnt['1'] = 1
    • cnt['z'] = 1
    • cnt['9'] = 1
      其他位置保持默认值 0。

第二步:计算字母镜像对的绝对差之和

  1. 确定镜像对的范围
    小写字母的镜像关系是'a''z''b''y',…,一直到'm''n'。总共 13 对(因为 26 个字母两两配对)。

  2. 遍历字母镜像对
    代码中通过for i := range 13循环 13 次,每次计算:

    • 当前字母'a' + i
    • 它的镜像字母'z' - i

    这样做的好处是每个镜像对只被计算一次,不会重复计算(c, m)(m, c)

  3. 计算绝对差并累加
    对于每对(c, m),计算它们在cnt数组中的频次差的绝对值abs(cnt[c] - cnt[m]),并累加到结果ans中。
    "ab1z9"为例:

    • 'a''z'的频次分别为 1 和 1,差为 0。
    • 'b''y'的频次分别为 1 和 0,差为 1。
    • 其余字母对的频次都是 0,差为 0。
      此步累加得到0 + 1 = 1

第三步:计算数字镜像对的绝对差之和

  1. 确定镜像对的范围
    数字的镜像关系是'0''9''1''8',…,一直到'4''5'。总共 5 对(10 个数字两两配对)。

  2. 遍历数字镜像对
    代码中通过for i := range 5循环 5 次,每次计算:

    • 当前数字'0' + i
    • 它的镜像数字'9' - i

    同样,每个镜像对只计算一次。

  3. 计算绝对差并累加
    对于每对(d, m),计算abs(cnt[d] - cnt[m])并累加到ans
    "ab1z9"为例:

    • '0''9'的频次分别为 0 和 1,差为 1。
    • '1''8'的频次分别为 1 和 0,差为 1。
    • 其余数字对的频次都是 0,差为 0。
      此步累加得到1 + 1 = 2

第四步:返回最终结果

将字母部分的结果(1)和数字部分的结果(2)相加,得到最终答案 3,并通过函数返回。


时间复杂度分析

  • 频次统计阶段:遍历字符串s一次,时间复杂度为O(n),其中n为字符串长度,n ≤ 500,000
  • 镜像对计算阶段:固定遍历 13 个字母对和 5 个数字对,总共 18 次常数次操作,时间复杂度为O(1)

总时间复杂度O(n)


额外空间复杂度分析

  • 使用了一个长度为 123 的整型数组cnt来统计频次,这个大小是常数,不随输入规模增长。
  • 其他变量(如循环索引、累加变量)占用常量空间。

总额外空间复杂度O(1)

Go完整代码如下:

packagemainimport("fmt")funcmirrorFrequency(sstring)(ansint){cnt:=['z'+1]int{}for_,ch:=ranges{cnt[ch]++}fori:=range13{ans+=abs(cnt['a'+i]-cnt['z'-i])}fori:=range5{ans+=abs(cnt['0'+i]-cnt['9'-i])}return}funcabs(xint)int{ifx<0{return-x}returnx}funcmain(){s:="ab1z9"result:=mirrorFrequency(s)fmt.Println(result)}

Python完整代码如下:

# -*-coding:utf-8-*-defmirror_frequency(s:str)->int:cnt=[0]*128# 覆盖 ASCII 范围内所有字符forchins:cnt[ord(ch)]+=1ans=0# 处理字母 a-zforiinrange(13):ans+=abs(cnt[ord('a')+i]-cnt[ord('z')-i])# 处理数字 0-9foriinrange(5):ans+=abs(cnt[ord('0')+i]-cnt[ord('9')-i])returnansdefmain():s="ab1z9"result=mirror_frequency(s)print(result)if__name__=="__main__":main()

C++完整代码如下:

#include<iostream>#include<string>#include<cmath>usingnamespacestd;intmirrorFrequency(conststring&s){intcnt[128]={0};// 覆盖 ASCII 范围内所有字符for(charch:s){cnt[ch]++;}intans=0;// 处理字母 a-zfor(inti=0;i<13;i++){ans+=abs(cnt['a'+i]-cnt['z'-i]);}// 处理数字 0-9for(inti=0;i<5;i++){ans+=abs(cnt['0'+i]-cnt['9'-i]);}returnans;}intmain(){string s="ab1z9";intresult=mirrorFrequency(s);cout<<result<<endl;return0;}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/21 5:50:07

YOLOv6 自定义目标检测训练实战:数据准备、训练、评估与推理

YOLOv6 自定义目标检测训练实战&#xff1a;数据准备、训练、评估与推理 这篇教程根据我复现 YOLOv6 自定义目标检测流程时整理&#xff0c;重点演示 YOLOv6 环境、数据格式、训练命令、评估和测试集推理。 本文整理自我的学习和项目复现过程&#xff0c;尽量按实操顺序保留 n…

作者头像 李华
网站建设 2026/7/21 5:49:55

SpringBoot+MyBatis-Plus实战:从零搭建物资管理系统

这次我们来看一个基于 SpringBoot 的“新冠物资管理系统”开源项目。对于正在学习 Java 全栈开发&#xff0c;特别是想通过一个完整项目来串联 SpringBoot、MySQL、Thymeleaf、MyBatis-Plus 等技术的同学来说&#xff0c;这是一个非常不错的练手资源。项目不仅提供了完整的源码…

作者头像 李华
网站建设 2026/7/21 5:48:59

自定义路径规划器CRP:C++实现、核心架构与工程实践

1. 项目概述&#xff1a;什么是CRP&#xff1f;如果你在机器人、自动驾驶或者游戏开发领域摸爬滚打过&#xff0c;肯定对“路径规划”这个词不陌生。简单说&#xff0c;就是给一个智能体&#xff08;比如机器人、游戏里的NPC&#xff09;从A点走到B点&#xff0c;找出一条最优或…

作者头像 李华
网站建设 2026/7/21 5:46:05

兼顾瘙痒与肝功能司拉德帕seladelparLivdelzi提升患者长期生活质量

顽固性瘙痒是原发性胆汁性胆管炎患者最难以忍受的伴随症状&#xff0c;超过60%的中晚期PBC患者会出现中重度瘙痒&#xff0c;严重影响睡眠、日常工作与情绪状态&#xff0c;既往部分治疗药物虽然能改善肝功能生化指标&#xff0c;却会不同程度加重瘙痒症状&#xff0c;陷入“肝…

作者头像 李华
网站建设 2026/7/21 5:44:12

表面等离子共振技术:分子互作定量检测金标准

在生物医药与分子生物学研究中&#xff0c;分子间相互作用分析是靶点验证、药物筛选、抗体评价的核心关键。传统ELISA、凝胶迁移等技术仅能实现终点定性检测&#xff0c;无法捕捉动态结合过程。表面等离子共振技术&#xff08;SPR&#xff09;作为无标记、实时、动态的高精度检…

作者头像 李华
网站建设 2026/7/21 5:43:40

行测资料分析速算技巧大全:粉笔名师的实战方法

资料分析是行测中投入产出比最高的模块&#xff0c;掌握粉笔公考名师总结的截位直除法、特征数字法、错位加减法等速算技巧后&#xff0c;考生完全可以在25至30分钟内完成20道资料分析题&#xff0c;并保持85%以上的正确率。 一、资料分析&#xff1a;行测中"投入产出比最…

作者头像 李华