欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 计数相关的题 Python 力扣

计数相关的题 Python 力扣

2025/6/22 21:34:17 来源:https://blog.csdn.net/m0_53291740/article/details/142708398  浏览:    关键词:计数相关的题 Python 力扣

2284. 最多单词数的发件人

给你一个聊天记录,共包含 n 条信息。给你两个字符串数组 messages 和 senders ,其中 messages[i] 是 senders[i] 发出的一条 信息 。

一条 信息 是若干用单个空格连接的 单词 ,信息开头和结尾不会有多余空格。发件人的 单词计数 是这个发件人总共发出的 单词数 。注意,一个发件人可能会发出多于一条信息。

请你返回发出单词数 最多 的发件人名字。如果有多个发件人发出最多单词数,请你返回 字典序 最大的名字。

注意:

  • 字典序里,大写字母小于小写字母。
  • "Alice" 和 "alice" 是不同的名字。

示例 1:

输入:messages = ["Hello userTwooo","Hi userThree","Wonderful day Alice","Nice day userThree"], senders = ["Alice","userTwo","userThree","Alice"]
输出:"Alice"
解释:Alice 总共发出了 2 + 3 = 5 个单词。
userTwo 发出了 2 个单词。
userThree 发出了 3 个单词。
由于 Alice 发出单词数最多,所以我们返回 "Alice" 。

示例 2:

输入:messages = ["How is leetcode for everyone","Leetcode is useful for practice"], senders = ["Bob","Charlie"]
输出:"Charlie"
解释:Bob 总共发出了 5 个单词。
Charlie 总共发出了 5 个单词。
由于最多单词数打平,返回字典序最大的名字,也就是 Charlie 。

提示:

  • n == messages.length == senders.length
  • 1 <= n <= 104
  • 1 <= messages[i].length <= 100
  • 1 <= senders[i].length <= 10
  • messages[i] 包含大写字母、小写字母和 ' ' 。
  • messages[i] 中所有单词都由 单个空格 隔开。
  • messages[i] 不包含前导和后缀空格。
  • senders[i] 只包含大写英文字母和小写英文字母。

 思路:

python有一个zip函数可以同时遍历两个数组,非常方便。中规中矩的一道题。最后返回的时候的写法可以借鉴一下,非常简洁。就算是二元组也能用前面一个数字来比较大小。

class Solution(object):def largestWordCount(self, messages, senders):hashmap = {}for message, sender in zip(messages, senders):length = len(message.split(" "))if sender in hashmap:hashmap[sender] += lengthelse:hashmap[sender] = lengthreturn max((v, k) for k, v in hashmap.items())[1]

347. 前 K 个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:

输入: nums = [1], k = 1
输出: [1]

提示:

  • 1 <= nums.length <= 105
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。

 解法:使用了类似冒泡排序的方式来进行排序,如果用堆的话,估计面试的时候不会有这个API来直接调,就先不管他的。做出来先。

class Solution(object):def topKFrequent(self, nums, k):""":type nums: List[int]:type k: int:rtype: List[int]"""dict={}for i in nums:dict[i]=dict.get(i,0)+1li=list(dict.keys())print(li)for i in range(len(li)):for j in range(len(li)-1-i):if dict[li[j]]<dict[li[j+1]]:li[j],li[j+1]=li[j+1],li[j]return li[0:k]

692. 前K个高频单词

给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。

返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序。

示例 1:

输入: words = ["i", "love", "leetcode", "i", "love", "coding"], k = 2
输出: ["i", "love"]
解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。注意,按字母顺序 "i" 在 "love" 之前。

示例 2:

输入: ["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"], k = 4
输出: ["the", "is", "sunny", "day"]
解析: "the", "is", "sunny" 和 "day" 是出现次数最多的四个单词,出现次数依次为 4, 3, 2 和 1 次。

注意:

  • 1 <= words.length <= 500
  • 1 <= words[i] <= 10
  • words[i] 由小写英文字母组成。
  • k 的取值范围是 [1, 不同 words[i] 的数量]

进阶:尝试以 O(n log k) 时间复杂度和 O(n) 空间复杂度解决。

解法:与上一题类似

class Solution(object):def topKFrequent(self,words, k):cnt = {}for word in words:cnt[word] = cnt.get(word, 0) + 1rec = list(cnt.keys())for i in range(len(rec)):for j in range(len(rec)-1-i):if cnt[rec[j]]<cnt[rec[j+1]]:rec[j],rec[j+1]=rec[j+1],rec[j]if cnt[rec[j]]==cnt[rec[j+1]] and rec[j]>rec[j+1]:rec[j],rec[j+1]=rec[j+1],rec[j]return rec[0:k]

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词