news 2026/1/26 18:53:33

【快速刷题模板】-2分钟秒杀字符统计-只出现一次的字符串

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【快速刷题模板】-2分钟秒杀字符统计-只出现一次的字符串

字符串-只出现一次的字符串

默写代码:

publicclassSolution{/** * @param str: str: the given string * @return: char: the first unique character in a given string */publiccharfirstUniqChar(Stringstr){// Write your code hereMap<Character,Integer>map=newHashMap<>();// 0if(str==null||str.length()==0)returnstr.charAt(0);// countfor(Characterc:str.toCharArray()){map.put(c,map.getOrDefault(c,0)+1);}for(inti=0;i<str.length();i++){charc=str.charAt(i);if(map.get(c)==1){returnc;}}returnstr.charAt(0);}}

为什么 Map<Character, Integer> map = new HashMap<>();用包装类

因为Java 泛型只支持引用类型,不支持基本类型。这是 Java 语言设计的硬性规定,与集合框架的实现机制直接相关。


核心原因:

  1. 泛型擦除机制
    Java 泛型是编译期语法糖,运行时会擦除类型信息变为Objectchar/int是基本类型,不属于Object子类,无法参与擦除转换。Character/Integer作为包装类,继承自Object,完全符合要求。

  2. 集合存储的是对象引用
    HashMap内部实现依赖Node<K,V>节点存储键值对,其字段类型是KV,只能是引用类型。基本类型没有引用概念。


编码便利性:自动装箱/拆箱

虽然必须用包装类,但 Java 5+ 的自动装箱机制让你几乎无感:

map.put('a',1);// 'a' 自动装箱为 Character,1 自动装箱为 Integercharc=map.keySet().iterator().next();// 自动拆箱intcount=map.get('a');// 自动拆箱

⚠️ 你代码的致命 Bug

if(str==null||str.length()==0)returnstr.charAt(0);// 空串时 charAt(0) 会抛异常!

应改为:

if(str==null||str.length()==0)return' ';// 或抛异常

效率优化:数组秒杀

这道题最优解是数组计数(ASCII 范围),比 HashMap 快 3-5 倍:

publiccharfirstUniqChar(Stringstr){if(str==null||str.length()==0)return' ';int[]count=newint[256];// ASCII 范围for(charc:str.toCharArray())count[c]++;for(charc:str.toCharArray())if(count[c]==1)returnc;return' ';}

记住:唯手熟尔,模板刻在骨子里才能秒。

2.// ASCII 范围为什么是256呢?

因为 8位二进制最多能表示256个不同数值(2^8 = 256),范围是0 ~ 255


详细解释:

  1. 标准 ASCII 码
    只定义了128个字符(0-127),包括字母、数字、控制符等。

  2. 扩展 ASCII 码
    早期系统为了容纳更多符号,把范围扩展到256(0-255),涵盖了拉丁字母、制表符等。

  3. 编程惯例
    在面试算法题中,题目默认字符串由可见字符组成,其 ASCII 值都在256范围内。用new int[256]100%覆盖所有可能性,且内存占用极小(仅 1KB)。

  4. Java char 类型
    Java 的char虽然是 16 位(Unicode),但本题涉及的字符都在 ASCII 子集内,所以用 256 的数组完全够用。


记住这个模板:

int[]cnt=newint[256];// 字符计数器标配

这是刷题肌肉记忆的一部分,唯手熟尔,直接刻进脑子里。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/6 2:17:03

LCD12864并行驱动:超详细版时序控制解析

深入LCD12864并行驱动&#xff1a;从时序到实战的完整掌控你有没有遇到过这样的情况&#xff1f;明明代码写得一丝不苟&#xff0c;引脚连接也一一核对无误&#xff0c;可LCD12864就是不亮、乱码、或者只显示半屏。更糟的是&#xff0c;有时候它“偶然”能工作&#xff0c;换个…

作者头像 李华
网站建设 2026/1/18 6:52:15

13、项目商业视角规划:成功的关键要素

项目商业视角规划:成功的关键要素 1. 商业规划的重要性 商业规划是项目规划的首要阶段,此阶段主要探索并明确需要解决的问题。有效的需求是一个约束参数框架,它能指导决策和设计。商业需求和目标是构建框架需求的起点,尽管项目最终会聚焦于用户需求,但满足用户需求始终是…

作者头像 李华
网站建设 2025/12/25 11:46:37

14、产品开发的策略与用户定位

产品开发的策略与用户定位 在产品开发过程中,有许多关键的策略和方法能够帮助我们打造出更具价值、更贴合用户需求的产品。下面将为大家详细介绍这些重要的内容。 1. 帕累托原则的应用 帕累托原则,也就是广为人知的“80/20 规则”,是一个在产品开发中极具价值的认知工具。…

作者头像 李华
网站建设 2026/1/18 12:32:54

23、软件迭代开发:原则、范围与实践

软件迭代开发:原则、范围与实践 1. 软件开发的灵活原则 在软件开发中,很多关于流程和流程图的讨论可能会让你过度担心是否严格遵循了规定程序。但实际上,成功的软件开发方法并非依赖于僵化的流程、流程图或严格的方法论。每个项目都是独特的,不存在适用于所有项目的单一方…

作者头像 李华
网站建设 2026/1/11 21:12:28

基于线性回归算法的房地产价格走势分析与预测开题报告

河北东方学院 本科毕业论文&#xff08;设计&#xff09;开题报告 题目 &#xff1a; 基于线性回归算法的房地产价格走势分析与预测 学院 &#xff1a; 人工智能学院 专业 &#xff1a; 数据科学与大数据技术 班级 &#xff1a; 2班 学生姓名 &#xff1a; 学…

作者头像 李华
网站建设 2026/1/18 5:36:02

(独家)Open-AutoGLM轻量化加载技术曝光:低配设备也能流畅运行

第一章&#xff1a;本地加载Open-AutoGLM 在本地环境中部署和运行 Open-AutoGLM 模型&#xff0c;是实现高效推理与定制化开发的关键步骤。该模型基于开源的 AutoGLM 架构&#xff0c;支持自然语言理解与生成任务&#xff0c;适用于私有化部署场景。 环境准备 在开始之前&…

作者头像 李华