day33 JZ50 第一个只出现一次的字符(Java)

183 阅读2分钟

题目来源: JZ50 第一个只出现一次的字符

题目描述:

  • 描述: 在一个长为 字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数) 数据范围: 0≤n≤10000,且字符串只有字母组成。 要求: 空间复杂度O(n),时间复杂度O(n)
示例1:
输入:"google"
返回值:4

示例2:
输入:"aa"
输出:-1

思路:哈希表

  • 知识点:哈希表 思路:
    • 题目要求要找到第一个出现一次的字符,最普遍的思路就是我们对字符串中每个字符出现的次数进行统计,然后便可以知道第一个出现一次的字符
    • 而对于统计次数,我们便可以使用哈希表,其中key存储每个字符,而value存储该字符出现的次数
  • 具体做法:
    • 1.对给出的字符串进行第一次遍历,将每个字符以及出现的次数存入哈希表,如果哈希表中已经有该字符,则直接进行value+1的操作
    • 2.再次对字符串进行遍历,并且读取哈希表中对应字符的value值,看是否是1,如果是,则直接得到第一个出现一次的字符
    • 3.如果直到第二次遍历字符串结束,也没有得到满足要求的字符,那么说明不存在这样的字符,返回-1即可

具体实现:

import java.util.*;
public class Solution {
    public int FirstNotRepeatingChar(String str) {
        HashMap<Character, Integer> mp = new HashMap<>();
        //统计每个字符出现的次数
        for(int i = 0; i < str.length(); i++) 
            mp.put(str.charAt(i), mp.getOrDefault(str.charAt(i), 0) + 1);
        //找到第一个只出现一次的字母
        for(int i = 0; i < str.length(); i++) 
            if(mp.get(str.charAt(i)) == 1)
                return i;
        //没有找到
        return -1; 
    }
}

复杂度分析:

  • 时间复杂度:O(n),其中n为字符串长度,两次单独的遍历
  • 空间复杂度:O(1),哈希表的大小最多不会超过字符集,即52个字符,属于常数空间

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情