字母汤决定你是否能用你碗里的字母写下你的信息

2024-04-27 03:37:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我被指派了一项用python解决的任务,需要帮助,因为我无法获得输出,以下是问题:-

每个人都喜欢字母汤。当然,你想知道你是否能从你碗里找到的字母中构造出一条信息

您的任务:

编写一个以两个字符串作为输入的函数:

  1. 你要写的消息
  2. 在你的字母汤碗里找到的所有字母

假设:

  • 这可能是一碗很大的汤,里面有很多字母
  • 无法保证每个字母出现的次数相同——事实上,有些字母可能完全丢失
  • 这些信是随机排列的

该函数应确定您是否可以使用在您的汤碗中找到的字母来编写消息。函数应相应地返回True或False

努力使你的工作效率更高。请使用Big-O表示法解释函数运行所需的时间,即消息长度(m)和汤碗中的字母数

以下是我尝试过的代码,但它没有按照任务工作:-

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))


Tags: 函数inalpha消息for字母resultupper
2条回答

我想你的老师希望你自己写一个scratch算法。然而,知道如何使用标准库的模块是一项非常有用的技能。下面是一个使用^{}的解决方案,它是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

解释

首先,处理步骤。

然后,计数器:

  • 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是否低于(或等于)soup中字符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

相关问题 更多 >