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

news/2024/5/20 16:24:57

题目

在这里插入图片描述
题目链接:
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.mrgr.cn/p/71470837

相关文章

计算机组成原理网课笔记

无符号整数的表示与运算 带符号整数的表示与运算 原反补码的特性对比 移码 定点小数

linux增加环境变量示例

首先,通过 vim ~/.bashrc 命令进入我这个用户的.bashrc文件内 然后在这个文件末尾添加环境变量,比如下面红框中的内容表示添加了路径/home/nfs_new/wangpeng/VSCode-linux-x64/bin为环境变量,实际上这里是把vscode启动命令添加作为环境变量了。其中, $PATH 表示之前所有的…

go学习笔记——Kratos框架

官方文档https://go-kratos.dev/en/docs/getting-started/start/1.安装Go 参考:mac安装go1.20 2.安装Kratos框架 kratos依赖protobuf grpc等框架,需要先进行安装brew install grpc brew install protobuf brew install protoc-gen-go brew install protoc-gen-go-grpc验证pro…

js逆向,参数加密js混淆

关键词 JS 混淆、源码乱码、参数动态加密 逆向目标 题目1&#xff1a;抓取所有&#xff08;5页&#xff09;机票的价格&#xff0c;并计算所有机票价格的平均值&#xff0c;填入答案。 目标网址&#xff1a;https://match.yuanrenxue.cn/match/1目标接口&#xff1a;https://ma…

【Linux】在Linux中执行命令ifconfig, 报错-bash:ifconfig: command not found解决方案

一、报错信息 ifconfig 报错-bash:ifconfig: command not found 同时&#xff0c;通过ip addr查看&#xff0c;也看不到IP信息 二、解决方案 找到ifcfg-ens0文件&#xff0c;此文件的目录在/etc/sysconfig/network-scripts目录下 命令&#xff1a;cd /etc/sysconfig/network…

m基于遗传优化的LDPC码NMS译码算法最优归一化参数计算和误码率matlab仿真

1.算法仿真效果 matlab2022a仿真结果如下:遗传优化迭代过程:误码率对比:2.算法涉及理论知识概要低密度奇偶校验码(Low-Density Parity-Check Code, LDPC码)因其优越的纠错性能和近似香农极限的潜力,在现代通信系统中扮演着重要角色。归一化最小和(Normalized Min-Sum, NMS)…

Vue.js-----vue组件

能够说出vue生命周期能够掌握axios的使用能够了解$refs, $nextTick作用能够完成购物车案例 Vue 生命周期讲解 1.钩子函数 目标&#xff1a;Vue 框架内置函数&#xff0c;随着组件的生命周期阶段&#xff0c;自动执行 作用: 特定的时间点&#xff0c;执行特定的操作场景: 组…

交流接触器

一般按负载电流的1.5倍选择;

IPFoxy:什么是静态住宅IP?静态ISP代理指南

静态住宅代理&#xff08;也称为静态ISP代理&#xff09;是最流行的代理类型之一。它们也是隐藏您的身份并保持在线匿名的最佳方法之一。您为什么要使用住宅代理而不是仅使用常规代理服务&#xff1f;下面我具体分享。 一、什么是静态住宅代理&#xff1f; 首先&#xff0c;我…

C++学习笔记——仿函数

文章目录 仿函数——思维导图仿函数是什么仿函数的优势理解仿函数仿函数的原理举例 仿函数——思维导图 仿函数是什么 使用对象名调用operator&#xff08;&#xff09;函数看起来像是在使用函数一样&#xff0c;因此便有了仿函数的称呼&#xff1b;仿函数存在的意义是&#x…

stm32 出现 hard fault 的排查记录

参考链接:https://blog.csdn.net/qq_43118572/article/details/1327596261、先验知识先验知识1: cortex m3 在中断/异常时,会把 8 个寄存器(xPSR、PC、LR、R12 以及R3-R0)的值压入栈。入栈顺序以及入栈后堆栈中的内容如下(CM4 是从低地址到搞地质):地址 寄存器 被保存的…

stm32 将外部 Flash挂载在 SPI 出现数据传输时好时不好的排查过程

现象: 将外部 Flash 挂载在 SPI,在 hardware_init() -> read_jedec_id() 里的 result = spi->wr(spi, cmd_data, sizeof(cmd_data), recv_data, sizeof(recv_data)) 中, recv_data 的值经常不一致,result 的值偶尔为 SFUD_SUCCESS, 大部分会 Error。备注: 正常情况…

力扣每日一题112:路径总和

题目 简单 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶子节点 是…

STM32实现1.8寸液晶屏 LCD SPI串口显示屏模块 TFT彩屏(标准库和HAL库实现)

目录 一、所选模块 液晶模块选择&#xff08;淘宝上均有售卖&#xff09; 模块引脚 二、嵌入式单片机型号 三、接线表设计 四、开发环境版本说明 五、标准库实现 六、HAL库实现 七、完整工程&#xff08;内含标准库和HAL库源码&#xff09; 代码链接 一、所选模块 液…

FFmpeg常用命令详解与实战指南

下载地址&#xff1a;Releases BtbN/FFmpeg-Builds (github.com) 1. 获取视频信息 使用FFmpeg获取视频信息是最基本的操作之一。你可以使用-i选项指定输入文件&#xff0c;然后使用FFmpeg内置的分析器来获取视频的各种信息&#xff0c;包括视频编解码器、音频编解码器、分辨…

【算法】滑动窗口——水果成篮

本篇博客是我对“水果成篮”这道题由暴力解法到滑动窗口思路的具体思路&#xff0c;有需要借鉴即可。 目录 1.题目2.暴力求解3.暴力优化3.1每次right不用回退3.2有些left长度一定不如前一个&#xff0c;不用走&#xff0c;left不回退 4.滑动窗口算法5.总结 1.题目 题目链接&am…

【win10 文件夹数量和看到不一致查看隐藏文件已经打开,Thumb文件作妖】

目录 任务介绍&#xff1a;重命名规则修改前修改后 实现思路VB代码实现BUG犯罪现场&#xff08;眼见不一定为实&#xff09;破案1&#xff1a;抓顶风作案的反贼&#xff01;&#xff01;&#xff01;破案2&#xff1a;破隐身抓刺客&#xff01;&#xff01;&#xff01;杀器&am…