news 2026/5/1 8:23:57

【快速刷题模板】-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/5/1 7:33:41

Dify平台支持代码片段生成与解释

Dify平台支持代码片段生成与解释 在AI驱动的开发时代&#xff0c;一个日益突出的问题是&#xff1a;如何让非专业开发者也能高效利用大语言模型&#xff08;LLM&#xff09;构建实用工具&#xff1f;尤其是在面对“写一段Python脚本处理Excel”或“解释这段SQL查询逻辑”这类具…

作者头像 李华
网站建设 2026/5/1 7:34:52

Dify开源框架对比分析:相较于LangChain的优势在哪里?

Dify开源框架对比分析&#xff1a;相较于LangChain的优势在哪里&#xff1f; 在AI应用开发正从“能跑通”迈向“可量产”的今天&#xff0c;一个现实问题摆在开发者面前&#xff1a;如何让大语言模型&#xff08;LLM&#xff09;真正落地为稳定、可控、可持续迭代的生产系统&a…

作者头像 李华
网站建设 2026/4/19 14:15:49

通过Dify实现多模态AI应用开发的可能性探讨

通过Dify实现多模态AI应用开发的可能性探讨 在智能客服系统中&#xff0c;用户不再满足于仅输入文字提问。他们更愿意直接上传一张产品故障照片、一段语音描述&#xff0c;甚至是一段视频&#xff0c;然后问&#xff1a;“这能修吗&#xff1f;”“这个功能怎么用&#xff1f;”…

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

Open-AutoGLM全流程拆解:从输入到自动推理生成的每一步细节

第一章&#xff1a;Open-AutoGLM工作原理概述Open-AutoGLM 是一个面向自动化生成语言模型任务的开源框架&#xff0c;旨在通过动态推理链构建与上下文感知机制&#xff0c;实现复杂自然语言任务的自主拆解与执行。其核心设计理念是将用户输入的高层任务自动分解为多个可执行子任…

作者头像 李华
网站建设 2026/5/1 8:22:54

(Open-AutoGLM模型架构深度拆解):解锁自动提示生成与模型调优黑科技

第一章&#xff1a;Open-AutoGLM模型架构深度拆解Open-AutoGLM 是一种面向自动化任务理解与生成的新型大语言模型&#xff0c;其核心设计理念在于融合图神经网络&#xff08;GNN&#xff09;与 Transformer 架构的优势&#xff0c;实现对复杂语义结构的高效建模。该模型通过引入…

作者头像 李华
网站建设 2026/4/26 21:39:50

11、项目团队组建与管理全解析

项目团队组建与管理全解析 团队成员的重要性 项目的整个过程都涉及运用智慧识别和解决问题,团队成员(包括利益相关者)的能力和资质是项目成功的最大贡献因素。再好的流程、卓越的开发方法和强大的管理能力,都比不上一支有才华、有干劲的团队所带来的成功。 很多时候,我…

作者头像 李华