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/4/18 12:32:34

Dify与Hugging Face模型库的无缝对接实现方式

Dify与Hugging Face模型库的无缝对接实现方式 在AI应用开发日益普及的今天&#xff0c;一个现实问题摆在开发者面前&#xff1a;如何快速将前沿的大语言模型&#xff08;LLM&#xff09;集成到实际业务中&#xff1f;许多团队拥有明确的应用场景——比如智能客服、合同审核或知…

作者头像 李华
网站建设 2026/4/18 3:46:25

18、深入了解用户:研究方法与分析策略

深入了解用户:研究方法与分析策略 1. 通过与用户交流进行研究 获取用户的直接反馈是用户研究的主要方式。虽然这种方式存在风险和缺点,比如用户常常误解自身的兴趣和活动,从而给出不准确的表述,但经验丰富的用户研究人员可以通过与用户进行结构化和非结构化的简单讨论,收…

作者头像 李华
网站建设 2026/4/29 19:05:29

Open-AutoGLM插件使用(性能优化黄金法则曝光)

第一章&#xff1a;Open-AutoGLM插件使用 Open-AutoGLM是一款专为自动化自然语言任务设计的开源插件&#xff0c;支持与主流大模型框架无缝集成&#xff0c;广泛应用于智能问答、文本生成和流程自动化场景。该插件通过声明式配置简化复杂任务链的构建&#xff0c;开发者可快速实…

作者头像 李华
网站建设 2026/4/24 19:19:36

27、优化用户体验:软件项目全流程指南

优化用户体验:软件项目全流程指南 1. 用户体验建议的延续性与发展 在软件项目中,我们所获得的建议并非在项目的最后一天、最后一个章节就戛然而止。正如我们在以往项目中体会到的,一个项目的经验和成功会为下一个项目提供宝贵的借鉴。当你完成一个以用户体验(UX)为核心的…

作者头像 李华
网站建设 2026/4/20 2:46:03

零基础学习AUTOSAR软件开发:通俗解释架构组成

零基础也能懂的AUTOSAR架构解析&#xff1a;从“车里有多少电脑”说起 你有没有想过&#xff0c;一辆普通的现代燃油车或电动车&#xff0c;内部究竟藏着多少个“小电脑”&#xff1f; 答案可能会让你吃惊—— 少则几十个&#xff0c;多则上百个 。这些被称为ECU&#xff08…

作者头像 李华
网站建设 2026/4/23 10:52:11

为什么顶尖AI团队都在关注Open-AutoGLM?(内部架构首次公开)

第一章&#xff1a;Open-AutoGLM 工作原理Open-AutoGLM 是一个基于自监督学习与图神经网络&#xff08;GNN&#xff09;融合架构的开源语言理解框架&#xff0c;旨在提升大语言模型在少样本场景下的推理能力。其核心机制通过构建语义图结构将文本片段转化为节点&#xff0c;并利…

作者头像 李华