java数据结构与算法刷题-----LeetCode451. 根据字符出现频率排序

Visual Studio调试时遇到ntdll.dll的PDB文件缺失?别慌,这3个方法帮你搞定(附详细步骤) 本文详细解析了Visual Studio调试时ntdll.dll的PDB文件缺失问题,提供了3种实用解决方案:调整调试设置、配置符号服务器与缓存目录、手动下载管理符号文件。通过分步指导和高级技巧,帮助开发者快速恢复完整的调试功能,特别适用于Windows平台下的C++项目开发。 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

在这里插入图片描述

1. hash统计出现次数后排序

解题思路:时间复杂度O( ) ,空间复杂度 O ( ),空间复杂度O( ),空间复杂度O()
  1. 通过hash表统计每个字符的出现次数,时间复杂度O( n n n)
  2. 对hash表按照出现次数降序排序,时间复杂度O( k ∗ l o g 2 k k*log_2{k} k∗log2​k)是快速排序的时间复杂度。其中k是hash大小,也就是字符串中不重复的字母个数

如果使用数组作为hash表,不使用HashMap的话,则不需要排序

  1. 然后依次将最大出现次数的字符,拼接起来,输出。正好是按照排序好的hash表进行输出。O( k k k)

使用数组作为hash表,虽然不需要排序,但是每次都得遍历整个hash表找到出现次数最多的字符。因此时间复杂度O( n ∗ k n*k n∗k)其中n是字符串大小,k是hash表大小。我们需要找到n个字符拼接为结果字符串,每次都需要完整遍历hash表(长度为k)找到出现次数最多的

  1. 因此时间复杂度为
  1. 直接使用HashMap,时间复杂度O( n + k ∗ l o g 2 k n+k*log_2{k} n+k∗log2​k),空间复杂度O( n + k n+k n+k).另外快速排序也需要额外栈空间O( l o g 2 k log_2{k} log2​k)
  2. 使用数组作为hash表,时间复杂度O( n + n ∗ k n+n*k n+n∗k),空间复杂度O(n+k).

使用数组作为hash表所需大小:
字符串包含大小写字母和数字,ASCII码如下:A = 65,Z = 90. a = 97,z = 122,0 = 48,9 = 57
因此hash表大小为123即可(下标从0到122)。并且从48开始,前面47的下标是没有用的

代码:选用数组作为hash,因为这样更难,做题情况下,比使用HashMap效率高很多(工作场景下没什么区别)。但是工作场景中,要使用HashMap。

在这里插入图片描述

class Solution {
    public String frequencySort(String s) {
        int[] list = new int[123];//hash表
        char[] chars = s.toCharArray();//获取字符数组
        for (int i = 0; i < chars.length; i++) {//统计每个字符出现的次数
            int n = (int) chars[i];//获取当前字符的ASCII码
            list[n]++;//对应hash位置+1
        }
        int index = 0;//结果字符数组的下标
        while (index < chars.length) {
            int max = 0;//保存最大值
            char target = ' ';//保存出现次数最多的字符
            for (int i = 48; i < list.length; i++) {//遍历hash表
                if (list[i] > max) {//如果当前字符出现次数更多
                    max = list[i];//保存这个次数
                    target = (char) i ;//让target指向这个字符
                }
            }
            for (int j = 0; j < max; j++) {//将其拼接到字符数组中
                chars[index++] = target;
            }
            list[target] = 0;//hash表中已经输出的字符归0
        }
        return String.valueOf(chars);
    }
}

2. 桶排序

解题思路:时间复杂度O( n + k n+k n+k),空间复杂度O( n + k n+k n+k)
  1. 先通过hash表统计每个字符的出现次数,时间复杂度O( n n n)
  2. 然后按照出现次数,将字符放入对应桶中。时间复杂度O( k k k)

桶保存的是对应出现次数的字符。例如1号桶保存出现1次的字符,2号桶保存出现次数为2的字符

  1. 然后从后往前遍历桶(出现次数高的先拼接到字符串)。时间复杂度O( k k k)

记住,当前是几号桶,取出的字符就出现几次。因此我们拼接字符串时,要将取出的字符每个都拼接对应桶的次数

代码:因为使用了StringBuilder,做题场景下的效率反而比方法1慢,但是实际工作场景中,肯定是这个方法的时间复杂度更优

在这里插入图片描述

class Solution {
   public String frequencySort(String s) {
        char[] charArray = s.toCharArray();
        int[] freq = new int[128]; // 使用128大小的数组,考虑到ASCII码表
        StringBuilder[] buckets = new StringBuilder[s.length() + 1];//桶,个数为字符串中字符个数+1
        // 统计字符出现频率
        for (char c : charArray) freq[c]++;
        // 将字符按照频率放入对应的桶中,出现次数是几,就放入几号桶
        for (int i = 48; i < 128; i++) {
            if (freq[i] > 0) {//如果当前字符出现次数>0
                //放入对应出现次数的桶中,例如当前字符出现3次,就放入3号桶
                if (buckets[freq[i]] == null) buckets[freq[i]] = new StringBuilder();//如果当前桶为空,先创建桶
                buckets[freq[i]].append((char)i);//然后将字符添加到桶中
            }
        }
        // 构建结果字符串
        StringBuilder result = new StringBuilder();
        for (int i = buckets.length-1; i > 0; i--) {//从后往前遍历桶
            if (buckets[i] != null) {//先查看,统计出现次数最高字符的桶
                for (char c : buckets[i].toString().toCharArray()) {//依次取出桶中字符
                    for (int j = 0; j < i; j++) {//当前是i号桶,这个字符需要添加i次,因为i是它的出现次数
                        result.append(c);
                    }
                }
            }
        }
        return result.toString();
    }
}
VC中sqlite的使用 在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示 立即下载

相关推荐

新手避坑指南:用镭神C32和KVH 1750 IMU做标定,为什么直接上lidar_align会失败?

本文详细解析了使用镭神C32激光雷达和KVH 1750 IMU进行标定时常见的失败原因及解决方案。从IMU的微分传感器特性到Lidar-IMU标定的数学本质,再到可行的标定方案和实操注意事项,帮助新手避开认知陷阱,掌握正确的标定方法。

weixin_30162121的博客 327

LeetCode 451. 根据字符出现频率排序(Java 代码)

桶排序

r'q'x't 的博客 252

告别手动点鼠标:用Python脚本批量跑ADS版图仿真,效率提升10倍(附完整代码)

本文详细介绍了如何利用Python脚本自动化ADS版图仿真流程,显著提升射频工程师的工作效率。通过调用ADS底层接口,实现参数化修改、批量任务调度和结果自动收集,解决了手动操作中的常见问题,如仿真不更新等。附完整代码,帮助开发者快速实现10倍效率提升。

weixin_42523543的博客 332

LeetCode451. 根据字符出现频率排序(含详细Java解析)采用桶排序

LeetCode451. 根据字符出现频率排序(含详细Java解析)采用桶排序 题目描述 什么是桶排序 可以通过这篇文章的学习掌握桶排序 链接附上:https://blog.csdn.net/sinat_51673411/article/details/123586187?spm=1001.2014.3001.5501 步骤分析 遍历原始字符串,找到出现最大的次数值 创建大小为最多次数的StringBuffer数组 循环遍历 得到StringBuffer[3]=abc这样的各个StringBuffe

sinat_51673411的博客 822

DeepSeek-V3本地Docker容器化部署

通过以上步骤,你可以在本地上成功通过容器化部署DeepSeek-V3。安装完成后,启动Docker Desktop。如果需要后台运行,可以加上。

u013302168的博客 2124

从波形到代码:手把手调试GaN图腾柱PFC的过零点切换与软启动策略

本文详细解析了GaN图腾柱无桥Boost PFC电路在过零点切换与软启动策略中的调试方法。通过波形分析、代码实现和寄存器配置,提供了解决误开通、震荡波形等问题的实用方案,帮助工程师优化电源设计效率与可靠性。

weixin_30831529的博客 424

LeetCode 451 根据字符出现频率排序 Java实现

LeetCode451 题目 给定一个字符串,请将字符串里的字符按照出现的频率降序排列。 示例 1: 输入: “tree” 输出: “eert” 解释: 'e’出现两次,'r’和’t’都只出现一次。 因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。 示例 2: 输入: “cccaaa” 输出: “cccaaa” 解释: 'c’和’a’都出现三次。此外,"aaaccc"也是有效的答案。 注意"cacaca"是不正确的,因为相同的字母必须放在一起。 示例 3: 输入: “Aabb

BedivereAlter的博客 326

Python爬虫实战【房产刚需专属】:爬取链家/贝壳完整房源数据,精准筛选刚需房源【房价+户型+地段+面积+装修】

本次爬虫的核心亮点就是刚需专属筛选,我已经把刚需买房的主流筛选逻辑封装为独立函数,你只需要修改筛选参数,就能精准匹配你的需求无需懂Python语法,直接改数字/文字即可!本次爬虫是刚需买房+Python爬虫实战的完美结合。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1827

leetcode *451. 根据字符出现频率排序(2021.7.3)

【题目】*451. 根据字符出现频率排序 给定一个字符串,请将字符串里的字符按照出现的频率降序排列。 示例 1: 输入: "tree" 输出: "eert" 解释: 'e'出现两次,'r'和't'都只出现一次。 因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。 示例 2: 输入: "cccaaa" 输出: "cccaaa" 解释: 'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。 注意"cacaca"是不正确的,因为相同的字母必须放在一起。 示例 3

Sophia_fez的博客 452

2025年新发表的语音大模型全双工模型/框架/技术

参考该论文,给出2025年新发表的全双工模型或框架或技术下面这份清单专挑、且与“全双工语音对话/同步对话(边听边说、可打断、回馈/相槌、重叠语音)”直接相关的。我也结合你提到的的四大维度(暂停处理、相槌、顺滑换手、打断管理)来点出它们各自的贡献点,便于后续评测与对比。

u013250861的博客 631

评估篇| 大模型评测综述

1、基于人类的评测。与针对基础大语言模型的自动化评测不同,微调大语言模型的评测更加注重模型在实际应用场景中的表现,如与人类交互的自然度、对齐度等。2、基于模型的评测。例如,AlpacaEval 排行榜 基于由大语言模型合成的人类需求指令作为评测任务,然后收集待评估大模型的回应,并采用 GPT-4 等大语言模型作为评测员,将待评估大语言模型的输出与参考输出进行成对比较。1、大语言模型对评估设置极为敏感,包括问题的表述方式、提示样本的选择以及答案的解析策略等,这些细微的差别都可能导致评估结果的显著变化。

youbingchen的博客 637

leetcode易错题(Java语言) - 451. 根据字符出现频率排序

没事别乱用 ==

qq_56990380的博客 702

vLLM 显存泄漏与 OOM 深度排查:从日志到火焰图

系统性地排查 vLLM 运行中的显存泄漏和 OOM 问题,包括 CUDA 内存快照、PyTorch 内存分析器、火焰图工具。

kaixin110a的博客 187

Java实现 LeetCode 451 根据字符出现频率排序

451. 根据字符出现频率排序 给定一个字符串,请将字符串里的字符按照出现的频率降序排列。 示例 1: 输入: “tree”...

5413

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【Leetcode】451. 根据字符出现频率排序

Leetcode: 451. 根据字符出现频率排序题目描述解题思路 题目描述 给定一个字符串,请将字符串里的字符按照出现的频率降序排列。 示例 1: 输入: “tree” 输出: “eert” 解释: 'e’出现两次,'r’和’t’都只出现一次。 因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。 示例 2: 输入: “cccaaa” 输出: “cccaaa” 解释: 'c’和’a’都出现三次。此外,"aaaccc"也是有效的答案。 注意"cacaca"是不正确的,因为相同的字母

小哲的博客 820

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

力扣小白刷题之451题根据字符出现频率排序

题目描述 给定一个字符串,请将字符串里的字符按照出现的频率进行降序排序。 思路 桶排序。 创建一个 Map 记录每个字符出现的频率 创建一个桶 List 将字符按频率升序放入桶中,每个桶里放出现频率相同的字符。第 i 个桶中存储的字符频率为 i。 倒序遍历桶,依次遍历输出每个桶中的元素。 代码 一些问题 Java String类中的 toCharArray() 方法将字符串转换为字符数组...

weixin_43525710的博客 408

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Leetcode 451. 根据字符出现频率排序

Leetcode 451. 根据字符出现频率排序 根据字符出现频率排序 给定一个字符串,请将字符串里的字符按照出现的频率降序排列。 示例 1: 输入: “tree” 输出: “eert” 解释: 'e’出现两次,'r’和’t’都只出现一次。 因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。 示例 2: 输入: “cccaaa” 输出: “cccaaa” 解释: 'c’和’a’都出现三次。此外,"aaaccc"也是有效的答案。 注意"cacaca"是不正确的,因为相同的字母必

EIUC_Thread的博客 277

leetcode.451. 根据字符出现频率排序

451. 根据字符出现频率排序 Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: "tree" Output: "eert" Explanation: 'e' appears twice while 'r' and 't' both appear once. So 'e' must appear before both 'r' and 't'. There

mirana的专栏 263

算法-根据字符出现频率排序

算法-根据字符出现频率排序1、根据字符出现频率排序 1、根据字符出现频率排序 451. 根据字符出现频率排序 给定一个字符串,请将字符串里的字符按照出现的频率降序排列。 示例 1: 输入: "tree" 输出: "eert" 解释: 'e'出现两次,'r'和't'都只出现一次。 因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。 示例 2: 输入: "ccca...

qq_23594799的博客 2393

Leetcode:451.根据字符出现频率排序

451.根据字符出现频率排序 题目描述 Leetcode:https://leetcode-cn.com/problems/sort-characters-by-frequency/ 给定一个字符串,请将字符串里的字符按照出现的频率降序排列。 示例 1: 输入: “tree” 输出: “eert” 解释: 'e’出现两次,'r’和’t’都只出现一次。 因此’e’必须出现在’r’和’t’之前。此外,...

_淡泊宁静的博客 238

力扣排序算法

力扣排序算法Kth Element 问题堆215. 数组中的第K个最大元素1.要求2. 思路 Kth Element 问题 用于求解 Kth Element 问题,也就是第 K 个元素的问题 快速排序的 partition() 进行实现。需要先打乱数组,否则最坏情况下时间复杂度为 O(N2) 堆 用于求解 TopK Elements 问题,也就是 K 个最小元素的问题。可以维护一个大小为 K 的最...

dayday学习的博客 1562

451. 根据字符出现频率排序Leetcode

文章目录题目描述思路及解答 题目描述 给定一个字符串,请将字符串里的字符按照出现的频率降序排列。 示例 1: 输入: “tree” 输出: “eert” 解释: 'e’出现两次,'r’和’t’都只出现一次。 因此’e’必须出现在’r’和’t’之前。此外,&quot;eetr&quot;也是一个有效的答案。 示例 2: 输入: “cccaaa” 输出: “cccaaa” 解释: 'c’和’a’都出现三次。此外,&quot;aaa...

qq_32682177的博客 319

【桶排序、堆排序】Leetcode --- NO.451 根据字符出现的频率排序(Java)

题目描述 题目分析 这道题就是找出每个字符出现的频率,然后根据频率来重组字符串 频率多的放前面,频率少的放后面,频率一样先后顺序随便,但是要字母要放在一次 跟 《Leetcode — NO.347 前K个高频元素》一样的解法 解法分析 首先要计算每个字符出现的频率,可以通过 Map 来存储字符和频率的对应关系 因为最后要将频率出现的多的字符放在前面,那就要对频率做一个排序 这里可以使用桶排序:第 i 个桶中出现的字符就说明出现了 i 次 也使用堆排序,跟第 347 那道题大同小异 代码 桶排序

不想打代码 363

leetcode题:451. 根据字符出现频率排序(中等)

一、题目描述:451. 根据字符出现频率排序(中等) 给定一个字符串,请将字符串里的字符按照出现的频率降序排列。 示例 1: 输入: "tree" 输出: "eert" 解释: 'e'出现两次,'r'和't'都只出现一次。 因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。 示例 2: 输入: "cccaaa" 输出: "cccaaa" 解释: 'c'...

tankpanv的博客 287

[LeetCode]451. 根据字符出现频率排序

根据字符出现频率排序 给定一个字符串,请将字符串里的字符按照出现的频率降序排列。 示例 1: 输入: "tree" 输出: "eert" 解释: 'e'出现两次,'r'和't'都只出现一次。 因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。 示例 2: 输入: "cccaaa" 输出: "cccaaa" 解释: 'c'和'a'都出现三次。此外,"aaaccc...

tc979907461的博客 543

Java HashMap中根据key或value进行排序

Java HashMap中根据key或value进行排序HashMap如何根据key进行排序HashMap如何根据value进行排序例题:leetcode算法题第451题 在之前的博客中,我介绍了Java中一些对于元素进行比较的方法,链接见: Java 自定义比较与排序方法——Comparable与Comparator的简单使用 Java 可用于比较与排序的lambda表达式和comparing方法 本博客继续介绍关于HashMap中存储的内容如何进行排序 HashMap如何根据key进行排序 我们还是会用

DTDanteDong的博客 2504
上一篇: java数据结构与算法基础-----字符串------正则表达式的练习案例---持续补充中
下一篇: java数据结构与算法刷题-----LeetCode75. 颜色分类
ydenergy_殷志鹏
博客等级 码龄7年 5887粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值