【小白也能懂】第一个只出现一次的字符 Hashmap做小白也能看懂的解法

第一个只出现一次的字符

http://www.nowcoder.com/questionTerminal/1c82e8cf713b4bbeb2a5b31cf5b0417c

题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)

这题我们看到题目后可以发现,因为他的字符串长度是有限的,而且我们需要找到只出现一次的字符,我们可以首先考虑用Hashmap这样的数据结构来把所有出现过的字符和他们对应的出现次数记录下来。接着,因为我们需要找到第一个只出现一次的字符,所以我们还需要把整个输入的字符串再遍历一遍,然后遍历时我们检测当前字符的出现次数在我们的hashmap里是不是1,如果我们一旦遇到符合条件的字符,直接返回他的位置,因为我们只要第一个符合条件的字符。所以这题分两步:

  1. 创建一个hashmap,然后遍历整个字符串一遍,记录下每个字符出现的次数
  2. 再次遍历整个字符串,根据我们前面存储的hashmap找哪个字符只出现过一次,直接返回他的位置

这里有个重点是,题目里说,字符需要区分大小写,因为我们这里是直接存储的字符,所以我们并没有改变他的大小写,所以不用进行额外的操作。但是如果题目产生变形,不需要区分大小写,我们可以在存储时把所有的字符都变成大写或者小写,放进hashmap的keyset里,然后找的时候也进行相应的变形,就可以了。

具体代码如下:

import java.util.*;

public class Solution {
    public int FirstNotRepeatingChar(String str) {
        if(str.length() == 0|| str == null){
            return -1;
        }

        HashMap<Character,Integer> map = new HashMap<>();
        for(int i = 0; i < str.length();i++){
            if(!map.keySet().contains(str.charAt(i))){
                map.put(str.charAt(i),1);
            }else{
                map.put(str.charAt(i),map.get(str.charAt(i))+1);
            }
        }

        for(int i = 0; i < str.length();i++){
            if(map.get(str.charAt(i)) == 1){
                return i;
            }
        }
        return -1;
    }
}
全部评论
嗯嗯,我明白了,谢谢!我当成遍历hashmap了。。。看到遍历的是str,明白了,谢谢!
2 回复 分享
发布于 2020-03-06 18:05
感谢博主的答案,但是,我有个问题,hashmap自己有自己内部的排序算法,也就是在put的时候,我们的确是按照顺序进行put键,但是在取键的时候,我们的顺序是不是不一定和put的时候顺序一样呢?那么这种做法是不是取出来的并不一定是第一个出现一次的字符呢?只是其中一个出现一次的字符?
点赞 回复 分享
发布于 2020-03-05 21:10
hashmap.contains内部是不是也算循环匹配,外面一层for循环,那么复杂度是不是算n^2
点赞 回复 分享
发布于 2022-03-12 14:00
这个不对吧
点赞 回复 分享
发布于 2022-11-03 13:33 江苏

相关推荐

10-17 10:05
已编辑
北华大学 全栈开发
牛客872465272号:掉头发了哥
点赞 评论 收藏
分享
评论
23
4
分享
牛客网
牛客企业服务