[OJ]平均串问题,存在超时问题未解决

众所周知,两个数a和b的平均数计算公式为(a+b)/2。
实际上平均数也可以描述为:从较小的数依次遍历到较大的数,将遍历的数放入一个列表中,该列表的中心元素。例如:求
3和7的平均数,列表为{3,4,5,6,7},平均数即为中心元素5。
类似的可以定义两个字符串A和B的平均串:设A的字典序小于B,,将由A按字典序生成B依次产生的字符串放入一个集合中,
该集合的中心元素即为平均串。例如求AZ和BF的平均串,按字典序生成的集合为{AZ,BA,BB,BC,BD,BE,BF},取中心元素BC即
为平均串。
给定两个长度相同,内容均为大写字母的字符串s1和s2,s1的字典序小于s2,输出它们的平均串。
在这里插入图片描述
在这里插入图片描述

1.暴力解决方法:使用大量递归,并占用大量内存,罗列每一个数,空间复杂度和时间复杂度极高

import sys
sys.setrecursionlimit(100000000) #例如这里设置为十万 
def main():#code hereglobal s1,s2,ss1=input().strip()s2=input().strip()s=s1if s1.isupper() and s2.isupper() and len(s1)==len(s2) and (len(s1)>=1 and len(s1)<=200000):global newStr,countcount=1newStr=[]newStr.append(s1)meanString(len(s1)-1)if count%2!=0:global meanStrmeanStr=count//2+1#subStr=newStr[1015:]addString(len(s1)-1)print(s)pass#在s1的基础上,加上count//2
def addString(k):global meanStr,sfor i in range(k,-1,-1):while meanStr>1 and s<s2:if i==len(s)-1 and ord(s[i])!=90:meanStr-=1s=s[:i]+s[i].replace(s[i],chr(ord(s[i])+1))+s[i+1:]else:if ord(s[i])!=90:    s=s[:i]+s[i].replace(s[i],chr(ord(s[i])+1))+s[i+1:]i=len(s)-1s=s[:i]+s[i].replace(s[i],chr(ord(s[i])-25))+s[i+1:]meanStr-=1addString(i)elif ord(s[i])==90:addString(i-1)#通过Ascii码进行比较 A=65 Z=90
def meanString(k):global s1,s2,newStr,count#通过首字母,保证s1的字典序小于s2#生成奇数个字符串 if s1<s2:#回溯for i in range(k,-1,-1):#从后往前循环#针对最后一个数while s1<s2: if i==len(s1)-1:                if ord(s1[i])<90:#将最后一个字符串替换                        s1=s1[:i]+s1[i].replace(s1[i],chr(ord(s1[i])+1))+s1[i+1:]count+=1newStr.append(s1)elif ord(s1[i])==90:i-=1meanString(i)breakelif i!=0:            if ord(s1[i])<90:   s1=s1[:i]+s1[i].replace(s1[i],chr(ord(s1[i])+1))+s1[i+1:]i=i+1                 s1=s1[:i]+s1[i:].replace(s1[i],chr(ord(s1[i])-25))i=len(s1)-1 count+=1newStr.append(s1)meanString(i)break                     elif ord(s1[i])==90:i-=1meanString(i)breakelif i==0: if ord(s1[i])<90:s1=s1[:i]+s1[i].replace(s1[i],chr(ord(s1[i])+1))+s1[i+1:] i=i+1                                  s1=s1[:i]+s1[i:].replace(s1[i],chr(ord(s1[i])-25))i=len(s1)-1count+=1 newStr.append(s1)   meanString(i)breakelif ord(s1[i])==90:breakif __name__ == '__main__':main();

运行结果如下:
在这里插入图片描述在这里插入图片描述问题:当字符长度为4时,进行上千次递归,程序出现问题,闪退
在这里插入图片描述
2.规律总结方法:

‘’’
规律总结:
AZ–DF : 1+52+6=59 (count=59)
(Z-Z+1):表示最后一位数,+1表示加上最开始的AZ,这里为1
(D-A-1)*26:表示BA–BZ…CA–CZ,,这里为52
(F-A)+1:表示从DA–DF之间的数,+1表示加上最后的DF这里为6
ABF–DDH:21+624+1352+78+7=2083(count=2083)
(Z-F+1):表示最后一位数ABF–ABZ,+1表示最开始的ABF,这里为21
(Z-B)*26:表示ACA–ACZ…AZA–AZZ,这里为624
(D-A-1)2626:表示BAA–BZZ…CAA–CZZ,这里为1352
(D-A)*26:表示从DAA–DAZ…DCA–DCZ,这里为78
(H-A+1):表示DDA–DDH,+1表示加上最后的DDH,这里为7
AABF–DDBH:21+624+16900+35152+2028+26+8=54759(count=54759)
(Z-F+1):表示最后一位数AABF–AABZ,+1表示最开始的AABF,这里为21
(Z-B)26:表示AACA–AACZ…AAZA–AAZZ,这里为624
(Z-A)2626:表示ABAA–ABZZ…AZAA–AZZZ,这里是16900
(D-A-1)2626
26:表示从BAAA–BZZZ…CAAA–CZZZ,这里是35152
(D-A)2626:表示从DAAA–DAZZZ…DCAAA–DCZZZ,这里是2028
(B-A)*26:表示从DDAA–DDAZ,这里是26
(H-A)+1:表示从DDBA–DDBH,+1表示加上最后的DDBH,这里是8

规律总结: 如果存在长度在2位以上的数,且首位不相等,首位相减大于1(这里D-A),那么count/2,即中心点一定在首位的式子中
例如AABF–DDBH:的中心点,在BAAA到DZZZ之间
如果存在长度在2位以上的数,且首位不相等,首位相减等于1(这里B-A),那么count/2,中心点一定落在第二位的式子中
AZZZ–BBZZ的中心点,在BAAA到BBZZ之间
如果存在长度为2位,且首位不相等,首位相减等于1(这里B-A),那么count/2,中心点一定落在第二位的式子中
AZ–BF的中心点在BA到BF之间

‘’’

'''
规律总结:
AZ--DF : 1+52+6=59 (count=59)
(Z-Z+1):表示最后一位数,+1表示加上最开始的AZ,这里为1
(D-A-1)*26:表示BA--BZ...CA--CZ,,这里为52
(F-A)+1:表示从DA--DF之间的数,+1表示加上最后的DF这里为6
ABF--DDH:21+624+1352+78+7=2083(count=2083)
(Z-F+1):表示最后一位数ABF--ABZ,+1表示最开始的ABF,这里为21
(Z-B)*26:表示ACA--ACZ...AZA--AZZ,这里为624
(D-A-1)*26*26:表示BAA--BZZ..CAA--CZZ,这里为1352
(D-A)*26:表示从DAA--DAZ...DCA--DCZ,这里为78
(H-A+1):表示DDA--DDH,+1表示加上最后的DDH,这里为7
AABF--DDBH:21+624+16900+35152+2028+26+8=54759(count=54759)
(Z-F+1):表示最后一位数AABF--AABZ,+1表示最开始的AABF,这里为21
(Z-B)*26:表示AACA--AACZ...AAZA--AAZZ,这里为624
(Z-A)*26*26:表示ABAA--ABZZ...AZAA--AZZZ,这里是16900
(D-A-1)*26*26*26:表示从BAAA--BZZZ...CAAA--CZZZ,这里是35152
(D-A)*26*26:表示从DAAA--DAZZZ...DCAAA--DCZZZ,这里是2028
(B-A)*26:表示从DDAA--DDAZ,这里是26
(H-A)+1:表示从DDBA--DDBH,+1表示加上最后的DDBH,这里是8规律总结:
如果存在长度在2位以上的数,且首位不相等,首位相减大于1(这里D-A),那么count/2,即中心点一定在首位的式子中
例如AABF--DDBH:的中心点,在BAAA到DZZZ之间
如果存在长度在2位以上的数,且首位不相等,首位相减等于1(这里B-A),那么count/2,中心点一定落在第二位的式子中
AZZZ--BBZZ的中心点,在BAAA到BBZZ之间
如果存在长度为2位,且首位不相等,首位相减等于1(这里B-A),那么count/2,中心点一定落在第二位的式子中
AZ--BF的中心点在BA到BF之间
'''
def main():#code hereglobal s1,s2s1=input().strip()s2=input().strip()if s1.isupper() and s2.isupper() and len(s1)==len(s2) and (len(s1)>=1 and len(s1)<=200000):global newStr,count,current_count,current_str,end_countcount=0current_count=0end_count=0current_str=s1substractString(0,s1,s2)if count%2!=0:        #print(count)global meanStr#在cureent_count的基础上进行计数#即在current_str的基础上进行加法AmeanStr=count//2-current_countaddString(len(s1)-1)print(current_str)pass#在s1的基础上,加上count//2
def addString(k):global current_str,meanStr#从末尾开始加,每当Z时,前一位变为原来的数加1,末尾置为A,例如BAAAfor i in range(k,-1,-1):'''判断meanStr落在哪个范围内如果1<=meanStr<=26,则在BAAA到BAAZ之间如果26+1<=meanStr<=26*26,则在BABA到BAZZ之间如果26*26+1<=meanStr<=26*26*26,则在BBAA到BZZZ之间'''if meanStr>0:if i==len(s1)-1:if  pow(26,len(s1)-(i+1))<= meanStr<=pow(26,len(s1)-i):current_str=current_str[:i]+current_str[i].replace(current_str[i],chr(ord(current_str[i])+meanStr))+current_str[i+1:]breakelif i!=0:while  pow(26,len(s1)-(i+1))+1<= meanStr<=pow(26,len(s1)-i):meanStr-=(pow(26,len(s1)-(i+1)))current_str=current_str[:i]+current_str[i].replace(current_str[i],chr(ord(current_str[i])+1))+current_str[i+1:] if meanStr<pow(26,len(s1)-(i+1))+1:addString(i+1)breakelse:#当i==0时while  pow(26,len(s1)-(i+1))+1<= meanStr<=end_count:meanStr-=(pow(26,len(s1)-(i+1))+1)current_str=current_str[:i]+current_str[i].replace(current_str[i],chr(ord(current_str[i])+1))+current_str[i+1:]if meanStr<pow(26,len(s1)-(i+1))+1:addString(i+1)break pass#需要记录首位的状态和此时计数的状态
def substractString(k,s1,s2):global count,current_count,current_str,end_countfor i in range(k,len(s1)):#s1中从前往后遍历if i==0:if  ord(s2[i])>ord(s1[i]):if ord(s2[i])-ord(s1[i])>1:for j in range(len(s1)-1,-1,-1):#从后往前遍历if j!=i:if j==len(s1)-1:count+=ord('Z')-ord(s1[j])+1#开始时的末尾else:count+=(ord('Z')-ord(s1[j]))*pow(26,len(s1)-1-j)current_count=countcurrent_str=chr(ord(s1[i])+1)+(len(s1)-1)*'A'#首字母加1,除了首字母外都是Acount+=(ord(s2[i])-ord(s1[i])-1)*pow(26,len(s1)-1)#计算首位#首位结束时的countend_count=countelif ord(s2[i])-ord(s1[i])==1:#当首位相差等于1时且2位数以上if len(s1)==2:for j in range(len(s1)-1,-1,-1):#从后往前遍历if j!=i:if j==len(s1)-1:count+=ord('Z')-ord(s1[j])+1#开始时的末尾else:count+=(ord('Z')-ord(s1[j]))*pow(26,len(s1)-1-j)current_count=countcurrent_str=chr(ord(s1[i])+1)+(len(s1)-1)*'A'#首字母加1,除了首字母外都是Acount+=(ord(s2[i])-ord(s1[i])-1)*pow(26,len(s1)-1)#计算首位#首位结束时的countend_count=countelif len(s1)>2:for j in range(len(s1)-1,-1,-1):#从后往前遍历if j!=i:if j==len(s1)-1:count+=ord('Z')-ord(s1[j])+1#开始时的末尾elif j==1:  current_count=countcount+=(ord('Z')-ord(s1[j]))*pow(26,len(s1)-1-j)if ord(s1[i+j])+1<90:current_str=s1[i]+chr(ord(s1[i+j])+1)+(len(s1)-1-j)*'A'#第二个字母加1,除了首字母、第二个字母外都是A#首位结束时的countend_count=countcount+=(ord(s2[i+j])-ord(s1[i+j])-1)*pow(26,len(s1)-1-j)#计算首位else:current_str=chr(ord(s1[i])+1)+(len(s1)-1)*'A'substractString(i+1,s1,s2) break       else:count+=(ord('Z')-ord(s1[j]))*pow(26,len(s1)-1-j)breakelif ord(s1[i])==ord(s2[i]): substractString(i+1,s1,s2)breakelse:breakelif i!=len(s1)-1:count+=(ord(s2[i])-ord('A'))*pow(26,len(s1)-1-i)else:#结束时的末尾count+=ord(s2[i])-ord('A')+1if end_count==0:end_count=countpassif __name__ == '__main__':main();

结果运行如下:直接突破50位长度,最终多少长度这里没有进行计算,但能够满足许多需求
在这里插入图片描述存在超时问题,超出该题的时间限制2m,未解决该问题,或许可以改用C++代码,能够大幅降低时间复杂度
在这里插入图片描述
3.为了找到两个字符串的平均串,我们可以按照字典序生成从第一个字符串到第二个字符串的所有中间字符串,然后找到中间位置的字符串作为平均串。下面是具体的步骤和代码实现:

步骤:

  • 确保字符串s1的字典序小于s2。如果不是,则交换两个字符串以确保条件满足。
  • 初始化一个空集合,用于存储按字典序遍历的所有字符串。
  • 从s1开始,逐步修改每个字符直到变成s2,同时将这些字符串添加到集合中。具体来说,对于s1和s2的每个位置i,从s1[i]开始逐步增加到s2[i],并构建对应的字符串添加到集合中。这样可以保证生成的字符串是字典有序的。
  • 找到集合中的字符串数量N(实际上这将是中间位置之前的字符串数量加上中间位置之后的字符串数量)。由于集合中的字符串是按字典序排序的,所以中间位置的字符串将是平均串。如果集合中的元素数量是奇数,则中间位置就是 (N+1)/2;如果集合中的元素数量是偶数,则中间位置介于 N/2 和 (N+1)/2 之间(即取两个中间位置的平均值)。计算平均串的方式可以是简单地取这两个中间位置的字符串的对应字符的平均值(这实际上不太可能产生有意义的平均串,因为我们处理的是字母而非数字),或者可以通过其他方法确定更合适的平均串。由于这个问题没有明确规定如何平均字母,我们可以假设需要找到中间位置的字符串。因此,我们需要向下取整来确定真正的中间位置。
  • 返回集合中对应中间位置的字符串作为平均串。假设返回的是更接近于末尾的中间位置的字符串(即向下取整的中间位置)。
def average_string(s1, s2):# 确保s1字典序小于s2if s1 > s2:s1, s2 = s2, s1# 构建按字典序排列的字符串集合strings_set = set()for i in range(len(s1)):# 逐步生成从s1到s2的所有可能字符串并添加到集合中for c in range(ord(s1[i]), ord(s2[i]) + 1):  # 使用ord函数获取字符的ASCII值范围遍历字符集temp_str = list(s1)  # 创建s1的副本以避免修改原始字符串temp_str[i] = chr(c)  # 修改副本中的字符以构建新的字符串strings_set.add(''.join(temp_str))  # 将新构建的字符串添加到集合中# 计算中间位置的索引并返回对应的字符串作为平均串middle_index = len(strings_set) // 2  # 计算中间位置索引(向下取整)average_str = list(strings_set)[middle_index]  # 获取中间位置的字符串(转换为列表方便索引)或者直接用二分查找等优化手段获取中间元素的值也可以避免将整个集合转换为列表带来的性能损耗。这里为了简化代码直接使用了列表访问方式。return average_str# 测试函数
print(average_string("AZ", "BF"))  # 输出应为 "BC"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024-06学习笔记

1.事务与数据库链接的占用 如果用Transactional注解&#xff0c;那在第一次与数据库交互的时候&#xff0c;就会打开数据库链接&#xff0c;再整个方法执行完&#xff0c;才会关闭数据库链接。 即使后边用的事务传播是required_new,那之前的事务也是被挂起&#xff0c;不会被…

静态路由学习笔记

1. 静态路由应用场景 &#xff08;1&#xff09;静态路由由网络管理员手动配置&#xff0c;配置方便&#xff0c;对系统要求低&#xff0c;适用于拓扑结构简单并且稳定的小型网络。 &#xff08;2&#xff09;缺点是不能自动适应网络拓扑的变化&#xff0c;需要人工干预过多。…

day05 Router、vuex、axios

配置 router和vuex需要在创建vue项目的时候&#xff0c;开始的时候选择Manually select features&#xff0c;于是就可以在下一个创建配置讯问中选择router和vuex。 axios则需要执行命令行&#xff1a; npm install axios -S 之后再在需要发送请求的view导入即可。 router…

研发(RD)注意事项 / 复杂项目规划、控制方法 PERT 和 CPM

注&#xff1a;机翻&#xff0c;未校对&#xff0c;去掉了原文中广告。 What Is Research and Development (R&D)? 什么是研发&#xff08;R&D&#xff09;&#xff1f; Investopedia / Ellen Lindner Research and Development An ongoing effort to develop or impr…

springboot中使用knife4j访问接口文档的一系列问题

springboot中使用knife4j访问接口文档的一系列问题 1.个人介绍 &#x1f389;&#x1f389;&#x1f389;欢迎来到我的博客,我是一名自学了2年半前端的大一学生,熟悉的技术是JavaScript与Vue.目前正在往全栈方向前进, 如果我的博客给您带来了帮助欢迎您关注我,我将会持续不断的…

Hive3:Centos7环境部署Hive服务

一、安装说明 1、Hadoop集群情况 3台机器&#xff1a;4G2C、2G2C、2G2C 安装教程&#xff1a;Centos7环境安装Hadoop集群 2、安装MySQL&#xff0c;用于存储Hive的元数据 在102机器上安装MySQL 安装MySQL使用服务器的root账号 3、最后安装Hive 安装hive过程使用服务器的atgu…

【C++】选择结构案例-三目运算符

三目运算符语法格式&#xff1a; 布尔表达式?表达式1:表达式2 运算过程&#xff1a;如果布尔表达式的值为 true &#xff0c;则返回 表达式1 的值&#xff0c;否则返回 表达式2 的值 &#xff08;三目运算符指的是&#xff1f;和&#xff1a;&#xff09; 在这个三目运算符…

postman请求响应加解密

部分接口&#xff0c;需要请求加密后&#xff0c;在发动到后端。同时后端返回的响应内容&#xff0c;也是经过了加密。此时&#xff0c;我们先和开发获取到对应的【密钥】&#xff0c;然后在postman的预执行、后执行加入js脚本对明文请求进行加密&#xff0c;然后在发送请求&am…

【游戏制作】使用Python创建一个完整的2048游戏项目

目录 项目运行展示 项目概述 项目目标 项目结构 安装依赖 代码实现 1. 导入库 2. 创建 Game2048 类 3. 设置UI界面 4. 加载二维码图片 5. 创建菜单 6. 游戏逻辑和功能 7. 运行应用 总结 创建一个完整的2048游戏项目 项目运行展示 项目概述 在这个项目中&#xff…

Mysql中如何实现两列的值互换?给你提供些思路。

文章目录 Mysql中如何实现两列的值互换1、第一感觉此sql应该能处理问题了2、需要一个地方存要替换的值&#xff0c;不然两列搞不定。2.1 加第三列&#xff1f;&#xff08;能解决&#xff0c;但是看起来呆呆&#xff09;2.2 上临时表&#xff08;搞点弯路走走&#xff09; 示例…

如何在 SpringBoot 中优雅的做参数校验?

一、故事背景 关于参数合法性验证的重要性就不多说了&#xff0c;即使前端对参数做了基本验证&#xff0c;后端依然也需要进行验证&#xff0c;以防不合规的数据直接进入服务器&#xff0c;如果不对其进行拦截&#xff0c;严重的甚至会造成系统直接崩溃&#xff01; 本文结合…

昇思25天学习打卡营第24天|RNN实现情感分类

RNN实现情感分类学习总结 概述 情感分类是自然语言处理领域的重要任务&#xff0c;主要用于识别文本中表达的情绪。本文使用MindSpore框架实现基于RNN的情感分类模型&#xff0c;示例包括&#xff1a; 输入: “This film is terrible” -> 标签: Negative输入: “This fi…

UE5.4内容示例(1)- 学习笔记

https://www.unrealengine.com/marketplace/zh-CN/product/content-examples 《内容示例》是学习UE5的基础示例&#xff0c;可以用此示例熟悉一遍UE5的功能 模型与材质部分 StaticMeshes FBX_Import_Options Material_Advanced Material_Decals Material_Instances Material_N…

Python 高阶语法

前言&#xff1a; 我们通过上篇文章学习了Python的基础语法&#xff0c;接下来我们来学习Python的高阶语法 1.初识对象 在Python中我们可以做到和生活中那样&#xff0c;设计表格、生产表格、填写表格的组织形式的 面向对象包含 3 大主要特性&#xff1a;  封装  继承 …

Zilliz 推出 Spark Connector:简化非结构化数据处理流程

随着人工智能&#xff08;AI&#xff09;和深度学习&#xff08;Deep Learning&#xff09;技术的高速发展&#xff0c;使用神经网络模型将数据转化为 Embedding 向量 已成为处理非结构化数据并实现语义检索的首选方法&#xff0c;广泛应用于搜索、推荐系统等 AI 业务中。 以生…

用护眼灯还需要开灯吗?护眼灯行业三大套路迷局揭秘

用护眼灯还需要开灯吗&#xff1f;在使用护眼台灯时&#xff0c;同时开启室内的主照明十分必要。如果关闭其他灯具&#xff0c;仅保留护眼台灯&#xff0c;那么只有台灯周围的小片区域能够被照亮&#xff0c;而房间的其他部分则处于相对昏暗的状态。这种明显的光线差异会造成视…

freertos的学习cubemx版

HAL 库的freertos 1 实时 2 任务->线程 3 移植 CMSIS_V2 V1版本 NVIC配置全部是抢占优先级 第四组 抢占级别有 0-15 编码规则&#xff0c; 变量名 &#xff1a;类型前缀&#xff0c; c - char S - int16_t L - int32_t U - unsigned Uc - uint8_t Us - uint…

《书生大模型实战营第3期》入门岛 学习笔记与作业:Python 基础知识

文章大纲 Python 简介1 安装Python1.1 什么是conda&#xff1f;1.1.1 功能与作用&#xff1a;1.1.2 常用命令&#xff1a;1.1.3 适用性&#xff1a; 1.2 Python安装与学习环境准备1.2.1 下载miniconda1.2.2 安装miniconda1.2.3 创建一个python练习专属的conda虚拟环境 2: Pytho…

【制作100个unity游戏之31】用unity制作一个爬坡2d赛车小游戏

最终效果 【制作100个unity游戏之31】用unity制作一个爬坡2d赛车小游戏 前言 今天用unity制作一个简单的爬坡2d赛车小游戏 素材 https://www.spriters-resource.com/mobile/hillclimbracing/ 拼装车素材 车身添加碰撞体&#xff0c;摩檫力0 轮胎添加碰撞体和刚体&#xff0…

【VSCode实战】Golang无法跳转问题竟是如此简单

上一讲【VSCode实战】Go插件依赖无法安装 – 经云的清净小站 (skycreator.top)&#xff0c;开头说到了在VSCode中Golang无法跳转的问题&#xff0c;但文章的最后也没给出解决方案&#xff0c;只解决了安装Go插件的依赖问题。 解决了插件依赖问题&#xff0c;无法跳转的问题也离…