题目描述
在一个字符串(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;
    }
}