如何解决字母汤 - 确定您是否可以用汤碗中的字母写下您的信息 首先是处理步骤然后,计数器:
我被赋予了在 python 中解决的任务,需要帮助,因为我无法获得输出,以下是问题:-
每个人都喜欢字母汤。当然,您想知道是否可以根据碗中的字母构造一条消息。
您的任务:
- 你想写的信息
- 在你的一碗字母汤中找到的所有字母
假设:
该函数应该确定您是否可以用碗汤中的字母来写信息。该函数应相应地返回 True 或 False。
尽量使您的功能高效。请使用 Big-O 表示法根据消息的长度 (m) 和一碗汤中的字母数 (s) 来解释您的函数运行所需的时间。
下面是我尝试过的代码,但它没有按照任务工作:-
def sol(alpha):
srt = sorted(list(alpha))
lwcase = sorted(list(alpha.lower()))
upcase = []
result = ''
for i in srt:
if i.isupper():
upcase.append(i)
for e in lwcase:
if upcase.count(e.upper()) != 0:
result += e.upper()
upcase.pop(upcase.index(e.upper()))
else:
result += e
return result
it = input("Enter a word please")
print(sol(it))
解决方法
我假设你的老师希望你自己编写一个算法来从头开始。然而,知道如何使用标准库的模块是一项非常有用的技能。这是使用 collections.Counter
的解决方案,它是 dict
的子类。
代码
import collections
def validate_soup(msg,soup):
msg_preprocessed = ''.join(msg.lower().split())
soup_preprocessed = ''.join(soup.lower().split())
msg_count = collections.Counter(msg_preprocessed)
soup_count = collections.Counter(soup_preprocessed)
return all(n <= soup_count[k] for k,n in msg_count.items())
测试
>>> validate_soup('Hello World','loollhed')
False
>>> validate_soup('Hello World','loollhedw')
False
>>> validate_soup('Hello World','loolhedwr')
False
>>> validate_soup('Hello World','loollhedwr')
True
>>> validate_soup('Hello World','abcloollhedwrdef')
True
说明
首先是处理步骤。
-
.lower()
将消息设为小写,因此'Hello World'
和hello world
是等价的,see the documentation; -
''.join(s.split())
从字符串s
,see this question 中删除所有空格; - 另见该问题:Python: remove all non-alphabet chars from string?;
然后,计数器:
-
collections.Counter(seq)
生成一个字典,将seq
的元素映射到它们出现的次数,例如Counter('helloworld') == {'l': 3,'o': 2,'h': 1,'e': 1,'w': 1,'r': 1,'d': 1}
; -
all()
是一个内置函数,用于检查谓词是否适用于序列的所有元素,see the doc; -
all(n <= soup_count[k] for k,n in msg_count.items())
检查消息中出现的每个字符n
的计数k
是否低于(或等于)汤中字符k
的计数。
这是我的解决方案(见评论):
def validate_soup(s: str,chars: str)-> bool:
d = {}
for c in chars:
count = d.get(c,0)
d[c] = count + 1
for c in s:
count = d.get(c,0)
if count <= 0:
return False
d[c] = count - 1
return True
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。