【LeetCode 每日一题】2053. 数组中第 K 个独一无二的字符串

Problem: 2053. 数组中第 K 个独一无二的字符串

文章目录

  • [1. 整体思路](#1. 整体思路)
  • [2. 完整代码](#2. 完整代码)
  • [3. 时空复杂度](#3. 时空复杂度)
      • [时间复杂度: O ( N ) O(N) O(N)](#时间复杂度: O ( N ) O(N) O(N))
      • [空间复杂度: O ( N ) O(N) O(N)](#空间复杂度: O ( N ) O(N) O(N))

1. 整体思路

核心问题

我们需要找到数组中第 k只出现一次的字符串。

  • 独一无二 (Distinct):该字符串在数组中出现的次数必须恰好为 1。
  • 顺序 :按照字符串在原数组中出现的顺序来数第 k 个。

算法逻辑

  1. 第一遍遍历(计数)

    • 遍历整个数组 arr
    • 使用一个哈希表 (HashMap) 来统计每个字符串出现的频次。
    • key: 字符串, value: 出现次数。
  2. 第二遍遍历(查找)

    • 再次按顺序遍历数组 arr
    • 对于每个字符串 s,检查它在哈希表中的计数是否为 1。
    • 如果是 1(说明是独一无二的),则将计数器 k 减 1。
    • k 减到 0 时,说明当前这个 s 就是我们要找的目标,直接返回。
  3. 兜底返回

    • 如果遍历完整个数组,k 依然大于 0,说明独一无二的字符串不足 k 个,返回空字符串 ""

2. 完整代码

java 复制代码
import java.util.HashMap;

class Solution {
    public String kthDistinct(String[] arr, int k) {
        // 创建哈希表,用于存储每个字符串的出现次数
        HashMap<String, Integer> count = new HashMap<>();
        
        // 第一遍遍历:统计频次
        for (String s : arr) {
            // merge 方法是 Java 8 引入的简化 Map 更新操作的方法
            // 如果 key 不存在,存入 value (这里是 1)
            // 如果 key 存在,执行 remappingFunction (这里是 Integer::sum,即旧值+1)
            count.merge(s, 1, Integer::sum);
            
            // 等价于传统写法:
            // count.put(s, count.getOrDefault(s, 0) + 1);
        }
        
        // 第二遍遍历:按原数组顺序寻找第 k 个独一无二的字符串
        for (String s : arr) {
            // 检查当前字符串的出现次数是否为 1
            if (count.get(s) == 1) {
                // 找到了一个独一无二的字符串,k 减 1
                k--;
                
                // 如果 k 变成了 0,说明这就是第 k 个,直接返回
                if (k == 0) {
                    return s;
                }
            }
        }
        
        // 如果遍历结束仍未找到第 k 个,返回空字符串
        return "";
    }
}

3. 时空复杂度

假设数组 arr 的长度为 N N N。

时间复杂度: O ( N ) O(N) O(N)

  • 第一遍循环 :遍历 N N N 个字符串,HashMap 的插入/更新操作平均为 O ( 1 ) O(1) O(1)。总耗时 O ( N ) O(N) O(N)。
  • 第二遍循环 :遍历 N N N 个字符串,HashMap 的查找操作平均为 O ( 1 ) O(1) O(1)。总耗时 O ( N ) O(N) O(N)。
  • 总计 : O ( N ) + O ( N ) = O ( N ) O(N) + O(N) = O(N) O(N)+O(N)=O(N)。

空间复杂度: O ( N ) O(N) O(N)

  • 哈希表开销 :在最坏情况下(所有字符串都不同),HashMap 需要存储 N N N 个键值对。
  • 结论 : O ( N ) O(N) O(N)。
相关推荐
chao1898444 小时前
基于 SPEA2 的多目标优化算法 MATLAB 实现
开发语言·算法·matlab
沪漂阿龙4 小时前
AI大模型面试题:支持向量机是什么?间隔最大化、软间隔、核函数、LinearSVC 全面拆解
人工智能·算法·支持向量机
little~钰5 小时前
倍增算法和ST表
算法
知识领航员6 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
薛定e的猫咪6 小时前
因果推理研究方向综述笔记
人工智能·笔记·深度学习·算法
一只机电自动化菜鸟6 小时前
一建机电备考笔记(33) 机电专业技术(起重技术-吊装方案)(含考频+题型)
经验分享·笔记·学习·职场和发展·课程设计
如何原谅奋力过但无声7 小时前
【灵神高频面试题合集06-08】反转链表、快慢指针(环形链表/重排链表)、前后指针(删除链表/链表去重)
数据结构·python·算法·leetcode·链表
平行侠7 小时前
037插入排序 - 整理扑克牌的算法
数据结构·算法
ECT-OS-JiuHuaShan7 小时前
彻底定理化:从量子纠缠到量子代谢
数据库·人工智能·学习·算法·生活·量子计算