389. 找不同

简介: LeetCode第389题“找不同”:t由s重排后添加一个字母构成。提供三种解法:1)双哈希表计数对比;2)单哈希表抵消计数;3)字符ASCII码求和相减。时间复杂度均为O(n),空间复杂度O(1)。

链接:https://leetcode.cn/problems/find-the-difference/description/

题目

简单来说 t 是由 s 随机重排,并添加一个字母而来的,那么已知:

  • t 的长度比 s 的长度大,并且为 1
  • s 和 t 中存在的字母数量 除了 t 新增的字母,其他都是一致的

解法一

思路

通过使用 哈希表,通过对两个字符串的字符索引(规则:字母 - 'a';例如:b,那么索引就为 1)分别进行哈希表计数,最终对比两张哈希表中的数量,数量不同,则说明当前索引对应的字母就是 t 新添加的字母

因为 s 和 t 的范围为 26个小写字母,那么直接通过 int 数组去模拟哈希表即可,例如:'a' 就代表数组索引 0,'b' 就代表数组索引 1

代码

/**
 * 执行用时分布 2 ms 击败 67.07% 消耗内存分布 42.42 MB 击败 62.25%
 * 利用 哈希表 字符计算找不同,只要两张 哈希表 的数量不同,则当前下标 + 'a' 就能得到添加的 字母
 */
public char findTheDifference(String s, String t) {
    // s 为空(s.length = 0),那就说明 t的长度为1,并且就是答案
    if (s.isEmpty()){
        return t.charAt(0);
    }
    // 因为 t 为 s 的随机重排,所以需要计数,才能知道新增的 字母是哪一个
    // 定义两个数组用于存放对应字母有多少个
    int[] sMap = new int[26];
    int[] tMap = new int[26];
    // 遍历 s 和 t
    for (int i = 0; i < s.length(); i++){
        // s 下标 = 字母 与 'a' 的 Unicode 码点距离(a 到 z 是按顺序的),例如:'b' - 'a' = 1
        int sIndex = s.charAt(i) - 'a';
        sMap[sIndex]++;
        // 等同于上面,只是换种写法
        tMap[t.charAt(i) - 'a']++;
    }
    // 因为 t 少遍历了一次,所以这里再进行处理
    tMap[t.charAt(t.length() - 1) - 'a']++;
    // 对比 sMap 和 tMap 的数量,就能找出不同
    for (int i = 0; i < 26; i++){
        // 数量不相同,代表找到了不同,直接返回即可
        if (sMap[i] != tMap[i]){
            return (char)('a' + i);
        }
    }
    // 不可能走到这里,因为上面已经遍历完了,返回 'a',只是因为不能返回空
    return 'a';
}

解法二

思路

既然 t 字符串中的字母除了新增加的 字母,其余的都与 s 一致(排除字母随机重排的因素),那么就可以将 两张哈希表缩少为 一张哈希表。

每当遍历 s 和 t 字符串的一个字母时,s 出现的字母,哈希表对应的数组索引 减一,t 出现的字母,哈希表对应的数组索引 加一。遍历结束后,哈希表中只有一个值为 1,其他为0。

最终遍历哈希表,如果值为 1,直接返回对应的字母即可

代码

/**
 * 执行用时分布 2 ms 击败 67.07% 消耗内存分布 42.14 MB 击败 97.27%
 * 使用 哈希表,并对 s 和 t 字符串对应的字母,进行抵消的方式,最终只要哈希表中索引不为 0,就是 t 字符串新增的字母
 */
public char findTheDifference(String s, String t) {
    // 使用 数组 模拟哈希表
    int[] map = new int[26];
    // 遍历 s 和 t
    for (int i = 0; i < s.length(); i++){
        // s 对应的字母,就往 哈希表中对应的索引 减 1
        map[s.charAt(i) - 'a']--;
        // t 对应的字母,就往 哈希表中对应的索引 加 1
        map[t.charAt(i) - 'a']++;
    }
    // 因为 t 少遍历了一次,所以这里再进行处理
    map[t.charAt(t.length() - 1) - 'a']++;
    // 遍历哈希表
    for (int i = 0; i < 26; i++){
        if (map[i] != 0){
            return (char)('a' + i);
        }
    }
    return 'a';
}

解法三

思路

还是和 上面解法二的思路差不多,只不过,现在不用哈希表了,直接使用 int 进行加减,此消彼长,最后加减得到的数,就是 t 新增的字母

代码

/**
 * 执行用时分布 2 ms 击败 67.07% 消耗内存分布 42.34 MB 击败 79.87%
 * 使用 int 直接计数的方式,对字符串 s 出现的字母 和 字符串 t 出现的字母,相互抵消,最终得到的结果就是 t 新添加的子母
 */
public char findTheDifference3(String s, String t) {
    int sum = 0;
    // 遍历 s 和 t
    for (int i = 0; i < s.length(); i++){
        // sum = sum + t.charAt(i) + 'a' - (s.charAt(i) - 'a')
        // sum = sum + t.charAt(i) - s.charAt(i);
        sum += t.charAt(i) - s.charAt(i);
    }
    // 因为 t 少遍历了一次,所以这里再进行处理
    sum += t.charAt(t.length() - 1) - 'a';
    return (char)('a' + sum);
}
目录
相关文章
|
2月前
|
人工智能 JSON API
2026最新|ComfyUI AI漫剧全自动教程:统一人设、智能分镜、插帧动效、批量成片保姆级指南
专为8G显存笔记本优化的本地AI漫剧生成方案:全离线运行,无需API密钥、无水印、不限次数。集成Qwen剧本生成+ComfyUI图像渲染,支持角色锁定、AI插帧、MP4成片闭环。资源包预装全部模型、插件、工作流及一键脚本,彻底告别GitHub下载难题,开箱即用。(239字)
|
3月前
|
弹性计算 人工智能 应用服务中间件
从0到1在云端部署Web应用:阿里云ECS全场景实战指南与2026省钱完全攻略
本文作者为阿里云云大使,基于真实部署经验,详解2026年阿里云服务器选型与实战:轻量服务器38元/年、ECS经济型99元/年,新用户享300元试用金+首购1折。涵盖博客、API、AI、电商等12类场景部署方案及安全、监控、成本优化技巧。(240字)
|
4月前
|
人工智能 搜索推荐 测试技术
实战拆解 GEO:外贸 B2B 企业如何构建面向 AI 搜索的增长引擎
本文详解外贸B2B企业应对AI搜索变革的GEO(生成式引擎优化)方法论:从“争搜索排名”转向“进AI答案”,强调构建企业数字人格、基于客户问题生产可信内容、建设知识原子库、双模官网承载、CRM闭环转化,并指出常见误区与分层验证指标,助力企业系统化打造AI时代的增长基础设施。
603 1
人工智能 安全 IDE
1162 30
|
7月前
|
搜索推荐 项目管理
HIS源代码,HIS解决方案,支持二级及以下医院标准化与个性化需求
医院信息管理系统(HIS)是医疗信息化核心平台,集成门诊、住院、收费、药房、医技、电子病历、医保等17大模块,实现全流程闭环管理与数据共享。支持二级及以下医院标准化与个性化需求,可无缝对接LIS、PACS系统,提升诊疗效率与管理水平。
1315 2
|
9月前
|
搜索推荐 数据可视化 安全
2026年外呼Agent产品推荐与选型指南
2026年,外呼系统迈向智能化升级,企业更关注业务闭环、客户体验与转化。瓴羊Quick Service依托通义大模型,实现营销、服务、运营一体化,支持情感识别、低代码配置与多系统集成,助力企业构建高效合规的智能外呼体系。
|
缓存 自然语言处理 API
Ascend推理组件MindIE LLM
MindIE LLM是基于昇腾硬件的大语言模型推理组件,提供高性能的多并发请求调度与优化技术,如Continuous Batching、PageAttention等,支持Python和C++ API,适用于高效能推理需求。其架构包括深度定制优化的模型模块、文本生成器和任务调度管理器,支持多种模型框架和量化方式,旨在提升大规模语言模型的推理效率和性能。
|
编解码 网络协议 Java
netty有什么优势
Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。它的主要特点包括:开发门槛低, 定制能力强 ,高性能,活跃的社区.