微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

字母汤 - 确定您是否可以用汤碗中的字母写下您的信息 首先是处理步骤然后,计数器:

如何解决字母汤 - 确定您是否可以用汤碗中的字母写下您的信息 首先是处理步骤然后,计数器:

我被赋予了在 python 中解决的任务,需要帮助,因为我无法获得输出,以下是问题:-

每个人都喜欢字母汤。当然,您想知道是否可以根据碗中的字母构造一条消息。

您的任务:

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

  1. 你想写的信息
  2. 在你的一碗字母汤中找到的所有字母

假设:

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

函数应该确定您是否可以用碗汤中的字母来写信息。该函数应相应地返回 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

说明

首先是处理步骤。

然后,计数器:

  • 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 举报,一经查实,本站将立刻删除。