鱼C论坛

 找回密码
 立即注册
查看: 5233|回复: 48

[已解决]Python:每日一题 335

[复制链接]
发表于 2020-2-19 21:27:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天的题目:


给定一个英文段落 paragraph 和一组限定词 banned,返回最出现次数最多的非限定单词

说明:
1. 至少有一个单词是非限定的。
2. 保证答案唯一。
3. 限定词都是以小写字母给出,paragraph 中的单词大小写不敏感。结果请返回小写字母。
4. 英文段落 paragraph 仅由字母、空格、标点 !?',;. 组成。


示例 1:

输入:paragraph = "Bob hit a ball, the hit BALL flew far after it was hit." 和 banned = ["hit"]
输出:"ball"
解释:
"hit" 出现 3 次但是限定词。
"ball" 出现 2 次,是出现次数最多的非限定词。
注意段落中大小写不敏感,标点符号忽略

示例 2:

输入:paragraph = "a a a b b c c d" 和 banned = ["a","b"]
输出:c"
解释:
"a" 和 "b" 都是限定词
"c" 出现了 2 次,而 "d" 只出现过一次
所以输出 "c"


欢迎大家一起答题!
最佳答案
2020-2-20 01:55:26
  1. import collections
  2. def fc335(paragraph,banned):
  3.         return collections.Counter([i.strip('!?\',;.') for i in paragraph.lower().split() if i.strip('!?\',;.') not in banned]).most_common(1)[0][0]
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-24 15:25:53 | 显示全部楼层
Lintcode 1369. 最频繁单词
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 13:32:37 | 显示全部楼层
wanting-for 发表于 2020-2-19 22:07
同时敲两种语言太累了,我老想末尾打分号

其实python允许末尾有分号……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-22 01:10:39 | 显示全部楼层
来一个马后炮。
  1. def solve(paragraph:str,banned:'list of str')->str:
  2.     tp = "!?',;."
  3.     for each in tp:
  4.         paragraph = paragraph.replace(each,' ')
  5.     while '  ' in paragraph:
  6.         paragraph = paragraph.replace('  ',' ')
  7.     paragraph = paragraph.lower()
  8.     words = paragraph.split()
  9.     unbanned = []
  10.     for word in set(words):
  11.         if word not in banned:
  12.             unbanned.append((word,words.count(word)))
  13.     return sorted(unbanned,key=lambda x:x[1],reverse=True)[0][0]
  14. if __name__ == '__main__':
  15.     print('示例1 输出:',repr(solve("Bob hit a ball, the hit BALL flew far after it was hit.",['hit'])))
  16.     print('示例2 输出:',repr(solve("a a a b b c c d",["a","b"])))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 21:28:13 From FishC Mobile | 显示全部楼层
有点小激动呢,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 21:02:58 | 显示全部楼层
def func335(paragraph, banned):
    paragraph = paragraph.lower()
    for each in banned + list("!?',;."):
        paragraph = paragraph.replace(each.lower(), '')
    result = paragraph.split()
    return max(result, key=result.count)

评分

参与人数 1荣誉 -3 鱼币 -3 收起 理由
zltzlt -3 -3 禁止抄袭

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 15:56:33 | 显示全部楼层
今天有新题吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 15:45:45 | 显示全部楼层
wanting-for 发表于 2020-2-20 15:34
paragraph = " ".join(['a', 'c', 'b'] * 100000), banned = ["a", "b"]
这个测试用例不正确吧,parag ...

解答错误

输入:paragraph = "Bob", banned = []
输出:"Bob"
预期结果:"bob"
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 15:44:30 | 显示全部楼层

确实是我看错了,非常抱歉,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 15:35:22 | 显示全部楼层
wanting-for 发表于 2020-2-20 15:34
paragraph = " ".join(['a', 'c', 'b'] * 100000), banned = ["a", "b"]
这个测试用例不正确吧,parag ...

是字符串啊

  1. >>> type(" ".join(['a', 'c', 'b'] * 100000))
  2. <class 'str'>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 15:34:29 | 显示全部楼层
  1. def solve(s:str, ban):
  2.     d, e = {}, ''
  3.     for i in s:
  4.         if i not in [' ','!','?',',',';','.',"'"]:
  5.             e += i
  6.         else:
  7.             e = e.lower()
  8.             if d.get(e) and e:
  9.                 d[e] += 1
  10.             elif not d.get(e) and e not in ban and e:
  11.                 d[e] = 1
  12.             e = ''
  13.     if e and e not in ban:
  14.         d[e] = 1
  15.     res = sorted(d.items(), key = lambda x : -x[1])
  16.     return res[0][0] if res else ''
  17. print(solve("Bob. hIt, baLl", ["bob", "hit"]))
复制代码

paragraph = " ".join(['a', 'c', 'b'] * 100000), banned = ["a", "b"]
这个测试用例不正确吧,paragaph应该是字符串啊,
感觉我这个效率应该不算高
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 15:32:41 | 显示全部楼层

输入 paragraph = " ".join(['a', 'c', 'b'] * 100000), banned = ["a", "b"] 超时
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 15:31:41 | 显示全部楼层
一个账号 发表于 2020-2-20 15:30
原来 remove() 效率这么低,改了一下代码:

解答错误

输入:paragraph = "Bob hit a ball, the hit BALL flew far after it was hit." 和 banned = ["hit"]
输出:"hit."
预期结果:"ball"
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 15:30:53 | 显示全部楼层
zltzlt 发表于 2020-2-20 14:12
解答错误

输入:paragraph = "abc abc? abcd the jeff!", banned = ["abc","abcd","jeff"]

越写越纠结
  1. import re
  2. def func335(paragraph, banned):
  3.     paragraph = re.sub(r"[!|?|'|,|;|.]", '', paragraph.lower())
  4.     for each in banned:
  5.         p = re.compile(r'\b%s\b' % each)
  6.         paragraph = p.sub('', paragraph)
  7.     result = paragraph.split()
  8.     return max(result, key=result.count)
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
zltzlt + 1 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 15:30:30 | 显示全部楼层
zltzlt 发表于 2020-2-20 14:57
嗯,解决一下超时的问题吧


原来 remove() 效率这么低,改了一下代码:

  1. def fun(paragraph : str, banned : list) -> str:
  2.     paragraph = paragraph.lower()
  3.     pun = "!?',;."
  4.     list1 = []
  5.     count = {}

  6.     paragraph = paragraph.split(" ")

  7.     for each in paragraph:
  8.         if each not in list1 and each not in banned:
  9.             list1.append(each)

  10.     for each in list1:
  11.         count[paragraph.count(each)] = each
  12.             
  13.     return count.get(max(count))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 15:00:25 | 显示全部楼层
zltzlt 发表于 2020-2-20 14:08
输入 paragraph = " ".join(['a', 'c', 'b'] * 100000), banned = ["a", "b"] 超时

搞不懂为什么会超时
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 14:57:18 | 显示全部楼层
一个账号 发表于 2020-2-20 14:55
搞错了,那一句是没有的

嗯,解决一下超时的问题吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 14:55:29 | 显示全部楼层
zltzlt 发表于 2020-2-20 14:05
你这一句什么意思?

搞错了,那一句是没有的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 14:52:32 | 显示全部楼层
kinkon 发表于 2020-2-20 14:44
缩成一行时犯了个小错误,改正了

可以了,56 ms
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 14:44:48 | 显示全部楼层
zltzlt 发表于 2020-2-20 14:14
解答错误

输入:paragraph = "Bob. hIt, baLl", banned = ["bob", "hit"]

缩成一行时犯了个小错误,改正了
  1. from collections import Counter   
  2. def p335(p,b):
  3.     lt = [i.strip("!?',;.") for i in p.lower().split() if i.strip("!?',;.") not in b]
  4.     return Counter(lt).most_common(1)[0][0]
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-13 11:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表