news 2026/4/16 19:57:06

【快速刷题模板】-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/16 6:15:56

如何用Open-AutoGLM实现自动化任务编排?(附完整代码示例)

第一章&#xff1a;Open-AutoGLM自动化任务编排概述Open-AutoGLM 是一个面向大语言模型&#xff08;LLM&#xff09;工作流的开源自动化任务编排框架&#xff0c;旨在简化复杂 AI 任务链的构建、调度与监控。它通过声明式配置支持多阶段任务执行&#xff0c;如文本生成、语义解…

作者头像 李华
网站建设 2026/4/16 9:22:02

企业自建在线培训考试平台源码系统 带完整的搭建部署教程

温馨提示&#xff1a;文末有资源获取方式一套功能完备、支持深度定制的企业培训考试系统源码&#xff0c;能够帮助企业以一次性投入&#xff0c;获得长期、高效的数字化培训能力&#xff0c;彻底告别繁琐的线下组织与高昂的第三方服务费用。源码获取方式在源码闪购网。系统核心…

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

QTimer 应用举例 qt c++

记忆要点QTimer::timeoutworker->moveToThread(&workerThread);connect(&workerThread, &QThread::started, worker, &Worker::doWork);dynamicTimer->stop();dynamicTimer->setInterval(500); // 改为0.5秒触发dynamicTimer->start();在Qt C中&am…

作者头像 李华
网站建设 2026/4/15 21:08:58

Open-AutoGLM究竟强在哪?3个关键设计让你彻底搞懂其工作原理

第一章&#xff1a;Open-AutoGLM究竟强在哪&#xff1f;真正的自动化推理能力 Open-AutoGLM 的核心优势在于其内置的多步推理引擎&#xff0c;能够自动拆解复杂任务并执行链式思考&#xff08;Chain-of-Thought&#xff09;。不同于传统模型依赖用户手动引导每一步&#xff0c;…

作者头像 李华