牛客NC97 字符串出现次数的TopK问题【中等 哈希+优先级队列 Java/Go】

题目

在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/fd711bdfa0e840b381d7e1b82183b3ee

核心

	哈希,优先级队列

Java代码

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** return topK string* @param strings string字符串一维数组 strings* @param k int整型 the k* @return string字符串二维数组*/public String[][] topKstrings (String[] strings, int k) {//哈希 ,优先级队列Map<String, Integer> smap = new HashMap<>();for (String s : strings) {if (!smap.containsKey(s)) {smap.put(s, 0);}smap.put(s, smap.get(s) + 1);}PriorityQueue<Integer> pq1 = new PriorityQueue<>(new Comparator<Integer>() {@Overridepublic int compare(Integer a, Integer b) {return b - a;}});Map<Integer, PriorityQueue<String>> pqm = new HashMap<>();Set<Integer> unique = new HashSet<>();for (String s : smap.keySet()) {int cnt = smap.get(s);if (!unique.contains(cnt)) {unique.add(cnt);pq1.add(cnt);pqm.put(cnt, new PriorityQueue<>());}pqm.get(cnt).add(s);}String[][] ans = new String[k][2];int prevcnt = pq1.poll();PriorityQueue<String> prevpq = pqm.get(prevcnt);int idx = 0;while (idx < k) {while (idx < k && prevpq.size() > 0) {String cur = prevpq.poll();ans[idx][0] = cur;ans[idx][1] = String.valueOf(prevcnt);idx++;}if (idx == k) break;prevcnt = pq1.poll();prevpq = pqm.get(prevcnt);}return ans;}
}

Go代码

package mainimport ("sort""strconv""strings"
)/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** return topK string* @param strings string字符串一维数组 strings* @param k int整型 the k* @return string字符串二维数组*/
func topKstrings(strings []string, k int) [][]string {//哈希,优先级队列smap := map[string]int{}for _, s := range strings {_, ok := smap[s]if !ok {smap[s] = 0}smap[s] = smap[s] + 1}times := []int{}pqm := map[int]*PQAsc{}unique := map[int]bool{}for k, v := range smap {_, ok := unique[v]if !ok {times = append(times, v)pqm[v] = &PQAsc{Arr: make([]string, 10), Size: 0}unique[v] = true}pqm[v].add(k) //k是字符串}ans := make([][]string, k)sort.Ints(times)idx := 0for i := len(times) - 1; i >= 0; i-- {curcnt := times[i]pq := pqm[curcnt]for idx < k && pq.Size > 0 {ans[idx] = make([]string, 2)ans[idx][0] = pq.remove()ans[idx][1] = strconv.Itoa(curcnt)idx++}}return ans
}// 上升堆  下标0也就是堆顶元素最小
type PQAsc struct {Arr  []stringSize int
}// 扩容代码
func (pq *PQAsc) ensurecap(cap int) {oldsize := len(pq.Arr)if oldsize >= cap {return}newsize := oldsize + oldsize>>1newarr := make([]string, newsize)for i := 0; i < oldsize; i++ {newarr[i] = pq.Arr[i]}pq.Arr = newarr}func (pq *PQAsc) add(s string) {pq.ensurecap(pq.Size + 1)pq.Arr[pq.Size] = spq.shiftup(pq.Size)pq.Size++
}// 上滤
func (pq *PQAsc) shiftup(idx int) {base := pq.Arr[idx]for idx > 0 {pid := (idx - 1) >> 1parent := pq.Arr[pid]/*如果字符串相等(s1 == s2),则返回0如果字符串1大于字符串2(s1> s2),则返回1。如果字符串1小于字符串2,则返回-1*/if strings.Compare(base, parent) >= 0 {break}pq.Arr[idx] = parentidx = pid}pq.Arr[idx] = base
}func (pq *PQAsc) remove() string {ans := pq.Arr[0]pq.Arr[0] = pq.Arr[pq.Size-1]pq.Size--pq.shiftdown(0)return ans
}// 下钻
func (pq *PQAsc) shiftdown(idx int) {half := pq.Size >> 1base := pq.Arr[idx]for idx < half {childidx := idx<<1 + 1right := childidx + 1child := pq.Arr[childidx]if right < pq.Size && strings.Compare(child, pq.Arr[right]) >= 0 {childidx = rightchild = pq.Arr[right]}if strings.Compare(base, child) <= 0 {break}pq.Arr[idx] = childidx = childidx}pq.Arr[idx] = base
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/322719.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI智能对话系统源码 内置所有支付接口 功能强大 带完整的安装代码包以及安装部署教程

在数字化日益普及的今天&#xff0c;AI智能对话系统已经成为企业与客户沟通的重要桥梁。为了满足市场的需求&#xff0c;罗峰给大家分享一款全新的AI智能对话系统源码&#xff0c;它集成了所有必要的支付接口&#xff0c;功能强大且易于部署。 以下是部分代码示例&#xff1a;…

vue3创建响应式数据ref和reactive的区别

reactive和ref在Vue.js中都是用于创建响应式数据的&#xff0c;但它们之间存在一些区别 定义数据类型不同。ref主要用于定义基本数据类型&#xff0c;如字符串、数字、布尔值等&#xff1b;reactive主要用于定义对象&#xff08;或数组&#xff09;类型的数据&#xff0c;但re…

备考2024年小学生古诗文大会:吃透10道历年真题和知识点(持续)

对上海小学生的小升初和各种评优争章来说&#xff0c;语文、数学、英语的含金量较高的证书还是很有价值和帮助的。对于语文类的竞赛&#xff0c;小学生古诗文大会和汉字小达人通常是必不可少的&#xff0c;因为这两个针对性强&#xff0c;而且具有很强的上海本地特色。 根据往…

MM模块学习一(供应商创建,物料类型的定义及功能)

物料管理流程&#xff1a; 源头&#xff1a;采购需求->采购申请 MRP&#xff1a;物料需求计划。运行物料需求计划的结果&#xff0c;根据物料的性质来判断是外购&#xff08;采购申请&#xff09;或者是生产&#xff08;计划订单->生产订单&#xff09;。 采购申请&am…

Angular基础-搭建Angular运行环境

这篇文章介绍了在Angular项目中进行开发环境搭建的关键步骤。包括node.js安装和配置、安装Angular CLI工具、安装angular-router、创建Angular项目等步骤。这篇文章为读者提供了清晰的指南&#xff0c;帮助他们快速搭建Angular开发环境&#xff0c;为后续的项目开发奠定基础。 …

改进灰狼算法优化随机森林回归预测

灰狼算法&#xff08;Grey Wolf Optimization&#xff0c;GWO&#xff09;是一种基于自然界灰狼行为的启发式优化算法&#xff0c;在2014年被提出。该算法模仿了灰狼群体中不同等级的灰狼间的优势竞争和合作行为&#xff0c;通过不断搜索最优解来解决复杂的优化问题。 灰狼算法…

如何使用ESOP电子作业指导书系统提高工作效率?

在当今工业生产和制造领域&#xff0c;实现作业标准化是提高生产效率、保证产品质量、提升企业竞争力的重要途径。而 ESOP 无纸化指导书系统作为一种创新的技术手段&#xff0c;正逐渐成为实现作业标准化的关键所在。 ESOP 无纸化指导书系统通过数字化的方式&#xff0c;将传统…

docker学习笔记(四)制作镜像

目录 第1步&#xff1a;编辑Dockerfile 第2步&#xff1a;编辑requirements.txt文件 第3步&#xff1a;编辑app.py文件&#xff0c;我们的程序文件 第4步&#xff1a;生成镜像文件 第5步&#xff1a;使用镜像&#xff0c;启动容器 第6步&#xff1a; 启动redis容器、将容器…

MySQL中JOIN连接的实现算法

目录 嵌套循环算法&#xff08;NLJ&#xff09; 简单嵌套循环&#xff08;SNLJ&#xff09; 索引嵌套循环&#xff08;INLJ&#xff09; 块嵌套循环&#xff08;BNLJ&#xff09; 三种算法比较 哈希连接算法&#xff08;Hash Join&#xff09; 注意事项&#xff1a; 工…

93、动态规划-最长回文子串

思路 首先从暴力递归开始&#xff0c;回文首尾指针相向运动肯定想等。就是回文&#xff0c;代码如下&#xff1a; public String longestPalindrome(String s) {if (s null || s.length() 0) {return "";}return longestPalindromeHelper(s, 0, s.length() - 1);…

django中的cookie与session

获取cookie request.COOKIE.GET 使用cookie response.set-cookie views.py from django.http import HttpResponse from django.shortcuts import render# Create your views here. def cookie_test(request):r HttpResponse("hello world")r.set_cookie(lan, py…

【第38天】SQL进阶-SQL设计优化-范式设计(SQL 小虚竹)

回城传送–》《100天精通MYSQL从入门到就业》 文章目录 零、前言一、练习题目二、SQL思路初始化数据什么是范式设计第一范式&#xff08;1NF&#xff09;第二范式&#xff08;2NF&#xff09;第三范式&#xff08;3NF&#xff09; 三、总结四、参考 零、前言 今天是学习 SQL …

Sealos急速部署生产用k8s集群

最近一段时间部署k8s全部使用sealos了&#xff0c;整体使用感觉良好&#xff0c;基本没有什么坑。推荐给大家。 使用 Sealos&#xff0c;可以安装一个不包含任何组件的裸 Kubernetes 集群。 最大的好处是提供 99 年证书&#xff0c;用到我跑路是足够了。不用像之前kubeadm安装…

CISCN 2023 初赛

Web unzip 文件上传页面 upload.php页面源码显示了出来 <?php error_reporting(0); highlight_file(__FILE__);$finfo finfo_open(FILEINFO_MIME_TYPE); if (finfo_file($finfo, $_FILES["file"]["tmp_name"]) application/zip){exec(cd /tmp &am…

中间件之异步通讯组件RabbitMQ进阶

这里我们必须尽可能确保MQ消息的可靠性&#xff0c;即&#xff1a;消息应该至少被消费者处理1次 那么问题来了&#xff1a; 我们该如何确保MQ消息的可靠性&#xff1f; 如果真的发送失败&#xff0c;有没有其它的兜底方案&#xff1f; 首先&#xff0c;我们一起分析一下消息…

文本批量操作技巧:内容查找不再繁琐,自动化批量移动至指定文件夹

在文本处理和信息管理的日常工作中&#xff0c;我们经常需要处理大量的文件和数据。面对这些海量的信息&#xff0c;如何快速而准确地查找特定的内容&#xff0c;并将它们批量移动至指定的文件夹&#xff0c;成为了一项关键的技能。本文将介绍办公提效工具一些实用的文本批量操…

企业车辆管理系统参考论文(论文 + 源码)

【免费】关于企业车辆管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89282550 企业车辆管理系统 摘 要 随着经济的日益增长,车辆作为最重要的交通工具,在企事业单位中得以普及,单位的车辆数目已经远远不止简单的几辆,与此同时就产生了车辆资源的合理…

实践精益理念:精益生产培训助力企业持续增长

在日益激烈的市场竞争中&#xff0c;企业如何寻找持续增长的动力&#xff0c;提升整体创新能力和核心竞争力&#xff1f;张驰咨询通过多年来的深入研究和实践&#xff0c;结合众多企业的实际情况&#xff0c;带来了精益生产培训的全新视角。 在近期举办的一次精益生产培训中&am…

DDR4 SDRAM 和DDR5 SDRAM的区别

DDR4 SDRAM和DDR5 SDRAM作为两代内存技术,它们在多个方面展现出了显著的差异和改进,以下是对两者区别的详细介绍: 性能与频率 DDR4 SDRAM 的标准工作频率范围从1600MHz(DDR4-1600)到3200MHz(DDR4-3200),在非超频情况下。它的数据传输速率和带宽因此在该范围内。DDR5 S…

JavaScript手写专题——图片懒加载、滚动节流、防抖手写

图片懒加载场景&#xff1a;在一些图片量比较大的网站&#xff08;比如电商网站首页&#xff0c;或者团购网站、小游戏首页等&#xff09;&#xff0c;如果我们尝试在用户打开页面的时候&#xff0c;就把所有的图片资源加载完毕&#xff0c;那么很可能会造成白屏、卡顿等现象&a…