Python,Recover a secret string from random triplets

news/2025/3/28 15:30:45/文章来源:https://www.cnblogs.com/l25428455/p/18791440
# # Recover a secret string from random triplets
# # https://www.codewars.com/kata/53f40dff5f9d31b813000774/train/python#我的解法(室友教的)
# Completed in 1.34ms
#使用拓扑排序算法,拓扑排序算法是一种对有向无环图进行排序的算法
#拓扑排序算法的步骤如下:
#1.从有向图中选择一个没有前驱的顶点并输出
#2.从有向图中删除该顶点和所有以它为起点的边
#3.重复1和2直到所有顶点都被输出
#如果有向图中有环,则无法进行拓扑排序
from collections import defaultdict
import queue
def recover_secret(triplets):in_degree = defaultdict(int)end_map = defaultdict(list)for [a,b,c] in triplets:in_degree[a]+=0in_degree[b]+=1in_degree[c]+=1end_map[a].append(b)end_map[b].append(c)zero_in_degree = queue.Queue()for key in in_degree.keys():if in_degree[key]==0:zero_in_degree.put(key)res = ''while(zero_in_degree.qsize()):char = zero_in_degree.get()res+=charfor end in end_map[char]:in_degree[end]-=1if in_degree[end]==0:zero_in_degree.put(end)if(len(res)!=len(in_degree)):return 'error'return restriplets = [['t', 'u', 'p'], ['w', 'h', 'i'], ['t', 's', 'u'], ['a', 't', 's'], ['h', 'a', 'p'], ['t', 'i', 's']
]
print(recover_secret(triplets))# 别人的解法 1
# Completed in 2.71ms
def recover_secret(triplets):# 将所有的字母提取出来,存放到letters中# 不停地遍历triplets,每遍历一个triplet,保证letters中这三个字母的相对顺序是正确的# 直到一次遍历triplets后,letters中的顺序没有发生变化,则说明letters中的字母顺序已符合tripletsletters = list(set([l for triplet in triplets for l in triplet]))# letters = list(set([l for l in triplet for triplet in triplets ])) #这样不行,会显示triplet未定义,说明是从左往右执行的isChanged = Truewhile isChanged:isChanged = Falsefor [a,b,c] in triplets:indexs = [letters.index(a),letters.index(b),letters.index(c)]if not (indexs[0]<indexs[1] and indexs[1]<indexs[2]):indexs.sort()letters[indexs[0]],letters[indexs[1]],letters[indexs[2]] = a,b,cisChanged = Truereturn ''.join(letters)# 别人的解法 2
# Completed in 7.55ms
def recoverSecret(triplets):#letters保存所有字符letters = set(x for triplet in triplets for x in triplet)# map each character to a value in the final ordering# initially, all characters are at 0positions = {char:0 for char in letters}# map each letter to a tuple of sets, one for all# letters to the left and one for all to the right of it# partition 分割,隔墙partitions = {char:(set(),set()) for char in letters}for tri in triplets:a,b,c = tri# add b,c to right of apartitions[a][1].add(b)partitions[a][1].add(c)# add a,c to left/right of bpartitions[b][0].add(a)partitions[b][1].add(c)# add a,b to left of cpartitions[c][0].add(a)partitions[c][0].add(b)# recursively(递归地) decrement(减少) a character's position, # and the position of all characters to its leftdef move_left(char, seen):# 避免重复减少if char in seen:returnpositions[char] -= 1seen.add(char)for l_char in partitions[char][0]:move_left(l_char, seen)# recursively increment a character's position, # and the position of all characters to its rightdef move_right(char, seen):if char in seen:returnpositions[char] += 1seen.add(char)for r in partitions[char][1]:move_right(r, seen)# Perform the infamous "STAND ASIDE" algorithm:# Every character pushes its left/right neighbours# away from itself, with VEHEMENCE and PREJUDICE.# There's some repetition here, but we can afford to# be lazy because the author was lazy and didn't implement# random tests. We could have hard-coded this stuff, but# the STAND-ASIDE algorithm is more glorious.for left, right in partitions.values():for l in left:move_left(l, set())for r in right:move_right(r, set())# sort by position and concatenate the resultreturn "".join(sorted(positions, key=lambda x: positions[x]))triplets = [['t', 'u', 'p'], ['w', 'h', 'i'], ['t', 's', 'u'], ['a', 't', 's'], ['h', 'a', 'p'], ['t', 'i', 's']
]
print(recoverSecret(triplets))# 失败的尝试# collections是python标准库中的一个模块,提供了几种额外的数据结构
# defaultdict是collections模块中的一个类,它是dict的子类,提供了一个工厂函数,为字典提供了默认值
# defaultdict在访问一个不存在的key时,不会抛出KeyError,而是自动为这个key创建一个默认值
# from collections import defaultdict
# def recover_secret(triplets):
#     values_map = defaultdict(int)
#     for [a,b,c] in triplets:
#         values_map[a] += 1
#         values_map[b] += 2
#         values_map[c] += 3
#     sorted_chars = sorted(values_map.keys(), key=lambda x: values_map[x])
#     return ''.join(sorted_chars)
# triplets = [
# ['t', 'u', 'p'], 
#     ['w', 'h', 'i'], 
#     ['t', 's', 'u'], 
#     ['a', 't', 's'], 
#     ['h', 'a', 'p'], 
#     ['t', 'i', 's']
# ]
# # t<u<p
# # [t<u<p w<h<i]
# # [t<[u<p s] w<h<i]
# # [t<s<u<p w<h<i]
# # [a<t<s<u<p w<h<i]
# # w<h<[a<t<s<u<p i]
# # w<h<a<t<[s<u<p i]
# # w<h<a<t<i<s<u<p# print(recover_secret(triplets))# from collections import defaultdict
# def recover_secret(triplets):
#     weights_map = defaultdict(set)
#     def upgrade(a,b):
#         for ch in weights_map[a]:
#             weights_map[b]|=weights_map[ch]
#     for [a,b,c] in triplets:
#         weights_map[a]|={a}
#         weights_map[b]|={b}
#         upgrade(a,b)
#         weights_map[c]|={c}
#         upgrade(b,c)
#         # enumerate() 允许在遍历课迭代对象时,同时获取元素的索引盒值,
#         # 该函数返回包含索引盒值的元组
#         # for i, c in enumerate(triplet):
#         #     weights_map[c] += 3**i
#     # sorted() 返回一个排序后的列表
#     sorted_chars = sorted(weights_map.keys(), key=lambda x: len(weights_map[x]))
#     return ''.join(sorted_chars)

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

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

相关文章

vue+leaflet示例:图层管理控件样式优化(附源码下载)

demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。 运行工具:vscode或者其他工具。 配置方式:下载demo源码,vscode打开,然后顺序执行以下命令: (1)下载demo环境依赖包命令:npm i (2)启动demo命令:npm run dev (3)打包demo命令: n…

2025西安交大集训Day4:单调栈,单调队列,线段树

2025西安交大集训Day4:单调栈,单调队列,线段树 引入 何为单调栈?顾名思义,单调栈即满足单调性的栈结构。与单调队列相比,其只在一端进行进出。 为了描述方便,以下举例及伪代码以维护一个整数的单调递增栈为例。 过程 插入 将一个元素插入单调栈时,为了维护栈的单调性,需要…

日事清甘特图制作工具:一键生成,精准管理项目周期

还在为制作甘特图而焦虑吗?别担心,日事清甘特图重磅登场,轻松帮你完美化解难题,让复杂任务规划变得简单高效!在工作中,我们很多岗位都经常需要对项目进度进行追踪,例如人事经理需要要追踪招聘进度或员工培训计划, 项目经理负责监督项目的各个阶段以保证按计划执行, 软…

网站自动备份同步工具,自动备份同步工具有哪些?

网站自动备份同步工具是保障网站数据安全的关键,需兼顾实时性、可靠性、易用性。以下是分场景推荐的工具及部署方案:一、工具分类推荐80KM备份软件 功能:支持多种备份方式,如系统备份、磁盘备份、文件备份等,支持定时备份。 步骤:管理端点新增,不管选择从管理端备份到客…

智慧运维如何赋能现代医院?看某中西医结合医院的数字化转型之路

在医疗信息化浪潮中,某中西医结合医院作为一家集医疗、教学、科研于一体的三甲医院,始终走在创新前沿。面对业务系统庞杂、跨部门协作效率待提升等挑战,医院携手采和科技,以“智慧运维”为核心理念,开启了一场数字化转型的深度实践。 痛点破局:从“人找服务”到“服务找人…

day:29 断点

一、断点介绍 1.为什么要打断点呢? 接口测试可以不需要管前端的,主要测后端的功能 2.断点的作用: 1.开发人员,调试,出错后在某个位置打断点调试代码; 2.测试人员,测试,绕过前端的限制,测试后端的反应; 3.测试人员,构造数据,设置断点可篡改请求和返回的数据包。根据测…

UE5--002--EnhancedInput

1. IA_Pause 输入动作2. IMC_Default 输入映射上下文3. BP_FirstPersonCharacter蓝图3. 1 给PlayerController动态配置MappingContext3. 2 事件响应4. BP_FirstPersonGameMode蓝图4. Project Settings

信用消费的血栓问题-逾期订单诊断指南

在信用消费场景中,用户最怕看到的两个字莫过于“逾期”,但现实中,有相当一部分逾期记录源于系统协同中的技术误差。在本篇文章中我将揭示逾期订单的形成机制,并给出一些常见问题的解决方式,希望能帮助到大家。在信用消费场景中,用户最怕看到的两个字莫过于“逾期”——它…

Linux软件无法获取IGPV3的udp数据问题

问题 tcpdump能获取到数据,但是其他进程(内部获取udp)无法获取此udp数据 源是来自IGPV3的组播源,添加之前已经试过加入组播,但是还是无法接收到数据 解决 使用命令 systcl -a |grep rp_filter发现设备开启了严格的反向过滤关闭 net.ipv4.conf.all.rp_filter和net.ipv4.co…

如何通过接口测试驱动PLM效能提升?2025年禅道等工具实践白皮书

一、PLM系统测试的行业痛点与转型机遇 全球PLM市场规模预计2025年突破500亿美元,但企业调研显示,73%的PLM系统测试问题集中在接口兼容性与数据流断层。某汽车零部件厂商因BOM变更未触发ERP同步,导致生产线停摆4小时损失超千万。这暴露出传统测试方法的三大致命短板:数据孤岛…